路径规划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.边界条件
边界时的迭代方程和一般迭代方程有一点差异
之后我写题解的时候也会包含这几点。