Leetcode 64. 最小路径和(中等) 动态规划

labuladong讲解

64. 最小路径和(中等)

题目:

现在给你输入一个二维数组 grid,其中的元素都是非负整数,现在你站在左上角,只能向右或者向下移动,需要到达右下角。现在请你计算,经过的路径和最小是多少?

 

思路:

从左上角位置 (0, 0) 走到位置 (i, j) 的最小路径和为 dp[i][j]

状态转移方程当然不会变的,dp[i][j] 依然取决于 dp[i-1][j] 和 dp[i][j-1]

那如果 i 或者 j 等于 0 的时候,就会出现索引越界的错误。

所以我们需要提前计算出 dp[0][..] 和 dp[..][0],然后让 i 和 j 的值从 1 开始迭代。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        vector<vector<int>> dp(m,vector<int>(n));
        // base case
        dp[0][0]=grid[0][0];
        for(int i=1;i<m;++i)
            dp[i][0]=grid[i][0]+dp[i-1][0];
        for(int j=1;j<n;++j)
            dp[0][j]=grid[0][j]+dp[0][j-1];
        //状态转移
        for(int i=1;i<m;++i){
            for(int j=1;j<n;++j){
                dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i][j];
            }
        }
        return dp[m-1][n-1];
    }
};

 

posted @ 2022-03-01 17:36  鸭子船长  阅读(26)  评论(0编辑  收藏  举报