【学会动态规划】下降路径最小和(8)

简介: 【学会动态规划】下降路径最小和(8)

动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:931. 下降路径最小和 - 力扣(Leetcode)

这道题读着非常拗口,但是画个图可以很好的理解:

比如说我们从箭头指向的这一格开始:

他能往下走的路径就i是图中的三个格子。

找出路径的最小和然后返回即可。

2. 算法原理

1. 状态表示

dp[ i ][ j ] 表示什么呢?

dp[ i ][ j ] 表示到达[ i,j ]的时候的路径最小值。

2. 状态转移方程

从最近的一步来找,而最近的一步有三种情况:

1. 从左上方来:dp[ i - 1 ][ j - 1 ] + m[ i ][ j ]

2. 从正上方来:dp[ i - 1 ][ j ] + m[ i ][ j ]

3. 从右上方来:dp[ i - 1 ][ j + 1 ] + m[ i ][ j ]

因为我们要的是最小的路径和,所以状态转移方程就是:

dp[ i ][ j ] = min( dp[ i - 1 ][ j - 1 ],dp[ i - 1 ][ j ],dp[ i - 1 ][ j + 1 ] ) + m[ i ][ j ]    

3. 初始化

为了防止越界,我们得在最左边最上面最右边都加一行。

但是左边和右边的那两行可不能初始化成0,得初始化成很大的数防止对计算产生影响。

所以我们就先把所有位置都变成很大的数,然后把第一行改成0就行。

4. 填表顺序

从上往下,从左往右(这个是无所谓的(因为左右的值是用不上的))

5. 返回值

返回最后一行的最小值。

3. 代码编写

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size(); 
        vector<vector<int>> dp(m + 1, vector<int>(n + 2, INT_MAX));
        for(auto& e : dp[0]) e = 0;
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1]))
                + matrix[i - 1][j - 1];
            }
        }
        int ans = INT_MAX;
        for(const auto& k : dp[m]) ans = min(ans, k);
        return ans; 
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
7月前
|
算法
【动态规划专栏】专题二:路径问题--------4.下降路径最小和
【动态规划专栏】专题二:路径问题--------4.下降路径最小和
59 2
|
7月前
|
机器学习/深度学习
动态规划|【路径问题】|931.下降路径最小和
动态规划|【路径问题】|931.下降路径最小和
|
7月前
|
算法 测试技术 C++
【动态规划】【map】【C++算法】1289. 下降路径最小和 II
【动态规划】【map】【C++算法】1289. 下降路径最小和 II
|
7月前
|
算法 测试技术 C++
【动态规划】1301. 最大得分的路径数目
【动态规划】1301. 最大得分的路径数目
|
7月前
leetcode-1200:最小绝对差
leetcode-1200:最小绝对差
43 1
|
7月前
LeetCode题:931下降路径最小和
LeetCode题:931下降路径最小和
51 0
|
算法 测试技术 C++
C++前缀和算法的应用:最大化城市的最小供电站数目(一)
C++前缀和算法的应用:最大化城市的最小供电站数目
|
算法 测试技术 C#
C++前缀和算法的应用:最大化城市的最小供电站数目(二)
C++前缀和算法的应用:最大化城市的最小供电站数目
|
算法 测试技术 C++
C++二分算法:找到最接近目标值的函数值(一)
C++二分算法:找到最接近目标值的函数值
【Leetcode -111.二叉树的最小深度 -112.路径总和】
【Leetcode -111.二叉树的最小深度 -112.路径总和】
50 0