leetcode64. Minimum Path Sum

这个题是从左上角到右下角的路径和最小,实际就是一道dp题。

第一种写法是只初始化(0,0)位置,第二种写法则是把第一行、第一列都初始化了。个人更喜欢第二种写法,简单一点。

dp的右下角的值就为最终的值

第一种写法:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int rows = grid.size();
        if(rows <= 0)
            return -1;
        int cols = grid[0].size();
        if(cols <= 0)
            return -1;
        vector<vector<int> > result(rows,vector<int>(cols));
        result[0][0] = grid[0][0];
        for(int i = 0;i < rows;i++){
            for(int j = 0;j < cols;j++){
                if(i != 0 && j != 0)
                    result[i][j] = grid[i][j] + min(result[i-1][j],result[i][j-1]);
                if(i == 0 && j != 0)
                    result[i][j] = result[i][j-1] + grid[i][j];
                if(j == 0 && i != 0)
                    result[i][j] = result[i-1][j] + grid[i][j];
            }
        }
        return result[rows-1][cols-1];
    }
};

 第二种写法:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size();
        if(m <= 0)
            return 0;
        int n = grid[0].size();
        if(n <= 0)
            return 0;
        vector<vector<int> > dp(m,vector<int>(n));
        dp[0][0] = grid[0][0];
        for(int i = 1;i < m;i++)
            dp[i][0] = dp[i-1][0] + grid[i][0];
        for(int i = 1;i < n;i++)
            dp[0][i] = dp[0][i-1] + grid[0][i];
        for(int i = 1;i < m;i++){
            for(int j = 1;j < n;j++){
                dp[i][j] = grid[i][j] + min(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[m-1][n-1];
    }
};
原文地址:https://www.cnblogs.com/ymjyqsx/p/9567236.html