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