路径规划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第一行