路径规划03
路径规划03
在前两个题基础上问题换成了求最小路径和
64. 最小路径和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
//状态转移方程
//dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
int rowN=grid.size();
int colN=grid[0].size();
int dp[rowN][colN];
dp[0][0]=grid[0][0];
for(int i=0;i<rowN;i++){
for(int j=0;j<colN;j++){
if(i>0 && j>0){
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}else if(i>0){
dp[i][j]=dp[i-1][j]+grid[i][j];
}else if(j>0){
dp[i][j]=dp[i][j-1]+grid[i][j];
}
}
}
return dp[rowN-1][colN-1];
}
};
状态转移方程:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
迭代方向:右和下
边界情况:上边缘,左边缘
进阶问题:如何求上述最短路径和的路径?
我的第一想法是直接反向从最后一个节点开始判断,因为这个二维数组保存的都是以(0,0)开始的最优子结构,那么倒推的时候必然是从两个最优子结构中找更小的路径值(因为正向的时候向右向下遍历,都是加当前value,肯定是最小的那个加value才能生成当前最小路径值)。
但是并不是所有情况都适用,能这么做的原因我回头思考了一下:
1.dp数组的值与路径有一定联系
2.dp数组的值都是从同一个原点出发生成的
三叶大佬的思路则是dp的时候利用一维数组 保存路径,这个路径可以正向保存也可以反向保存。