路径规划05


路径规划05

931. 下降路径最小和

class Solution {
public:
    int minFallingPathSum(vector>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        //先假设从第一个点出发,再遍历第一行所有节点,找min
        int dp[m][n];
        memset(dp,0,sizeof(dp));
        
        int ans=2147483647;
        //遍历第一行
        for(int i=0;i0  && jdp[m-1][i] ){
                tmp=dp[m-1][i];
            }
        }

        return tmp;

    }
};
迭代方程:dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])+matrix[i][j];
迭代方向:自顶向下,左下or右下
边界条件:正方形左右两边
初始条件:第一行dp等于第一行matrix

做这一题的时候,刚开始的想法会被上一题三角形dp影响,有想要遍历第一行的想法,但那违背了dp的初衷,因为dp本身就是求最优子结构的过程,那样做的话复杂度成了恐怖的o(n^3)。这一点在三叶的刷题笔记也有讲到。

与此同时,我又对这几题我自己做题的方式又有了新的总结,感觉所有dp路径问题无非考虑这四点:

1.迭代方程

迭代方程根据边界判断的不同也会存在变化

2.迭代方向

与遍历的方向和路径的方向选择有关

3.初始条件

一般是最开始源点对应的dp值,赋值操作

4.边界条件

边界时的迭代方程和一般迭代方程有一点差异

之后我写题解的时候也会包含这几点。