路径规划06

路径规划06

1289. 下降路径最小和 II

本题和上一题没有太大区别,就是注意用两个变量保存上一行的dp最小值和次小值

#include <cstring>
class Solution {
public:
    
    int minFallingPathSum(vector<vector<int>>& grid) {
        int n=grid.size();
        //迭代方程: dp[i][j]=dp[i-1][minIndex]+grid[i][j];
        int dp[n][n];
        memset(dp,0,sizeof(dp));
        //给第一排赋值
        for(int i=0;i<n;i++){
            dp[0][i]=grid[0][i];
        }
        //开始dp
        int minIndex,minIndex2;
        for(int i=1;i<n;i++){
            //每次换行更新上一行的最小和第二小值
            minIndex=min_element(dp[i-1],dp[i-1]+n)-dp[i-1];
            int tmp=dp[i-1][minIndex];
            dp[i-1][minIndex]=100;
            minIndex2=min_element(dp[i-1],dp[i-1]+n)-dp[i-1];
            dp[i-1][minIndex]=tmp;
            //cout<<dp[i-1][minIndex]<<" "<<dp[i-1][minIndex2]<<endl;
           
            for(int j=0;j<n;j++){           
                if(j!=minIndex){
                    dp[i][j]=dp[i-1][minIndex]+grid[i][j];
                }else{
                    dp[i][j]=dp[i-1][minIndex2]+grid[i][j];
                }
            }


        }
        //在最后一排找最小路径
        int minPath=dp[n-1][0];
        for(int i=0;i<n;i++){
            //cout<<dp[n-1][i]<<endl;
            if(minPath>dp[n-1][i])
                minPath=dp[n-1][i];
        }
        return minPath;
    }

};


迭代方程:dp[i][j]=dp[i-1][minIndex]+grid[i][j];(最小)
		dp[i][j]=dp[i-1][minIndex2]+grid[i][j];(次小)
迭代方向:向下
边界条件:相邻两行选择的结点不能是同一列
初始条件:dp第一行为grid第一行
posted @ 2021-11-28 22:01  秋月桐  阅读(26)  评论(0编辑  收藏  举报