路径规划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的时候利用一维数组 保存路径,这个路径可以正向保存也可以反向保存。

posted @ 2021-11-25 20:25  秋月桐  阅读(35)  评论(0编辑  收藏  举报