码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 猿创征文 |【算法面试入门必刷】动态规划-线性dp(二)


    【算法入门必刷】动态规划-线性dp(二)

    • 前言
    • 算法入门刷题训练
      • 题目AB35:三角形最小路径和
        • 题目分析
        • 理论准备
        • 题解
    • 小结

    📦个人主页:一二三o-0-O的博客
    🏆技术方向:C/C++客户端资深工程师(直播+音视频剪辑)
    👨‍💻作者简介:数据结构算法与音视频领域创作者
    📒 系列专栏:牛客网面试必刷
    📣专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer
    📝推荐一个找工作神器:牛客刷题网 【面试经验|实习招聘内推,求职就业一战解决】
    🧡如果对您有帮助的话,欢迎点赞👍收藏📂,关注不迷路

    【算法入门必刷】数据结构-栈篇系列文章:
    【算法入门必刷】数据结构-栈(一)
    【算法入门必刷】数据结构-栈(二)
    【算法入门必刷】数据结构-栈(三)
    【算法入门必刷】数据结构-栈(四)
    【算法入门必刷】数据结构-栈(五)

    【算法入门必刷】动态规划-线性dp篇系列文章:
    【算法面试入门必刷】动态规划-线性dp(一)
    【算法面试入门必刷】动态规划-线性dp(二)
    【算法面试入门必刷】动态规划-线性dp(三)

    前言

    开启刷题,请点击右边链接进行跳转点击这里

    在这里插入图片描述

    算法入门刷题训练

    题目AB35:三角形最小路径和

    题目分析

    给定一个正三角形数组,自顶到底分别有 1,2,3,4,5…,n 个元素,找出自顶向下的最小路径和。
    每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。
    数据范围:三角形数组行数满足1≤n≤200 ,数组中的值都满足∣val∣≤10^4

    如果已经看过【算法面试入门必刷】动态规划-线性dp(一)的伙伴,看到这道三角形最小路径题目,可以推理出最底层的某一个节点和等于上一层同列节点的和与上一层前一列节点的和的最小值加上当前值。如下图所示:即sumC = min(sumA,sumB) + 1。经过这样的分析可以得出递推公式:f(i)(j) = min(f(i-1)(j),f(i-1)(j-1)) + num(i表示当前行数,j表示当前列数);
    在这里插入图片描述

    理论准备

    任何算法都有相对应的算法模板或者有规律的解题步骤。对于动态规划来讲,做DP相关的算法题要熟练掌握下面DP解题步骤,这样有助于在面对到各种各样的题目时能够提高解题效率:

    DP解题步骤:

    1. 首先要确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
    2. 根据确定好的dp数组,给出递推公式,也叫状态转移方程。
    3. 确定dp数组是否需要初始化,初始化为多少。
    4. 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
    5. 根据测试用例进行验证

    题解

    具体的解决方案如下:

    1. 首先确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
    // 这里使用二维dp,因为有行列
    // dp[i][j] 表示到达第i行第j列的节点自顶向下的最小路径和为dp[i][j]
    vector<vector<int>> dp(300,vector<int>(300));
    
    • 1
    • 2
    • 3
    1. 根据确定好的dp数组,给出递推公式。
    // 根据题目分析我们得出了以下递推公式
    if(j == 0){// 处理左侧的边界条件
        dp[i][j] = dp[i-1][j] + triangle[i][j];
    }else if(j == n-1){// 处理右侧的边界条件
        dp[i][j] = dp[i-1][j-1] + triangle[i][j];
    }else{// 正常节点
        dp[i][j] = min(dp[i-1][j],dp[i-1][j-1]) + triangle[i][j];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 确定dp数组是否需要初始化,初始化为多少。
    // 根据本题的边界条件,只需要将dp[0][0]赋值为三角形的顶点即可
    dp[0][0] = triangle[0][0];
    
    • 1
    • 2
    1. 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
    // 本题从小到大遍历行,从小到大遍历列
    for(int i{1};i < m;++i){
    	vector<int> colV = triangle[i];
    	int n = colV.size();
    
    	for(int j{};j<n;++j){
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 根据测试用例进行验证:选择所有的测试用例带入验证即可。

    2. 完整代码如下:

    class Solution {
    public:
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 
         * @param triangle int整型vector> 
         * @return int整型
         */
        int minTrace(vector<vector<int> >& triangle) {
            // write code here
            
            vector<vector<int>> dp(300,vector<int>(300));
            int m = triangle.size();
            
            dp[0][0] = triangle[0][0];
            int result{dp[0][0]};
            
            for(int i{1};i < m;++i){
                vector<int> colV = triangle[i];
                int n = colV.size();
                
                int minValue{INT_MAX};
                for(int j{};j<n;++j){
                    if(j == 0){
                        dp[i][j] = dp[i-1][j] + triangle[i][j];
                    }else if(j == n-1){
                        dp[i][j] = dp[i-1][j-1] + triangle[i][j];
                    }else{
                        dp[i][j] = min(dp[i-1][j],dp[i-1][j-1]) + triangle[i][j];
                    }
                    
                    
                    if(i == m-1) {
                        if(dp[i][j] < minValue) minValue = dp[i][j];
                    }
                }
                
                result = minValue;
            }
            
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    当提交成功后,会展示如下界面,那么恭喜这道题目就通过了!
    在这里插入图片描述

    小结

    祝愿所有的伙伴都能拿到自己心仪的Offer!📣伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网

  • 相关阅读:
    一个.Net开发的功能强大、易于使用的流媒体服务器和管理系统
    3分钟教你用MindSpore和Jina搭建一个服装搜索系统!
    NLP:使用 SciKit Learn 的文本矢量化方法
    基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(二)板卡总体设计
    阿里云:加大NoSQL数据库软硬件一体化技术自研
    C++ 不知树系列之认识二叉树(顺序、链表存储的实现)
    Vue学习——props(23)
    JavaScript 用法
    ESP8266-Arduino编程实例-Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动
    java类加载器总结
  • 原文地址:https://blog.csdn.net/MichaelKongChina/article/details/126666094
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号