💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
前言
今天我们来讲动态规划的第九题,这个题目和前面的有一题非常想,就是礼物最大价值这个问题,他两实际上就是相反的,其余的理解都是一样的,再初始化方面有一点不一样,我们一起来看看是一个什么样的题目吧
第九个题目是最小路径和:
我们发现这一类路径问题套路都是一样的,下篇再来一个关于路径的压轴题,他们的做题思路相差不大,这个题目意思非常好理解,我就补做具体介绍,我们直接用动态规划思想解题
动态规划的步骤给大家讲解:
-
状态表示:经验+题目要求
以(i,j)位置为起点,dp[i][j]表示:到达(i,j)位置的最小路径和 -
状态转移方程:以最近一步的状态来算此状态
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+g[i][j]
- 初始化:抱枕该数组不越界,我们的第一行或者第一列都有可能越界,所以我们要多开辟一行和一列来创建虚拟节点,要保证后面的填表是正确的,下标的映射关系
4. 填表顺序:从上往下,从左往右
5. 返回值:(i,j)位置就是最小路径和,所以返回dp[m][n];
代码实现:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
//1.创建dp表
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
//2.初始化
dp[0][1] = dp[1][0] = 0;
//3.填表
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
//4.返回值
return dp[m][n];
}
};
运行结果:
这题有了前面题目的基础后,就是逻辑发生了一点变化,所以难度不大,大家自己应该也可以写出来,下个题目,就是路径问题的最后一个题目了,难度肯定有所提升,希望大家迎接新题目的挑战,我们下题再见