路径规划05

路径规划05

931. 下降路径最小和

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& 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;i<n;i++){
            dp[0][i]=matrix[0][i];
        }
        //迭代方程: dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1]))+matrix[i][j];
      
        for(int i=1;i<m;i++){
            for(int j=0;j<n;j++){
                if(j>0  && j<n-1){
                    dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1]))+matrix[i][j];
                }else if(j==0){
                    dp[i][j]=min(dp[i-1][j],dp[i-1][j+1])+matrix[i][j];
                }else if(j==n-1){
                    dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+matrix[i][j];
                }
            }
        }
        //遍历最后一排找出最短的那条路径值
        int tmp=dp[m-1][0];
        for(int i=0;i<n;i++){
            //cout<<dp[m-1][i]<<" ";
            if(tmp>dp[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.边界条件

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

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

posted @ 2021-11-27 23:01  秋月桐  阅读(34)  评论(0编辑  收藏  举报