64. 最小路径和 - 力扣(LeetCode)

题目描述

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

题解

同“不同路径”一题思路相同,采用动态规划,动态转换方程为:
d p [ j ] = { m i n ( d p [ j ] + g r i d [ i ] [ j ] , d p [ j − 1 ] + g r i d [ i ] [ j ] ) if i ! = 0 且 j ! = 0 d p [ j ] + g r i d [ i ] [ j ] if j = = 0 d p [ j − 1 ] + g r i d [ i ] [ j ] if i = = 0 dp[j] = \begin{cases} min(dp[j] + grid[i][j], dp[j - 1] + grid[i][j]) &\text{if}& i!= 0且j!=0 \\ dp[j] + grid[i][j] &\text{if}&j==0\\ dp[j - 1] + grid[i][j]&\text{if}&i==0 \end{cases} dp[j]=min(dp[j]+grid[i][j]dp[j1]+grid[i][j])dp[j]+grid[i][j]dp[j1]+grid[i][j]ifififi!=0j!=0j==0i==0

代码

/*
dp[i] = min(dp[i] + grid[row][i], dp[i - 1] + grid[row][i - 1])
*/
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int n = grid.size();//行数
        int m = grid[0].size();//列数
        int dp[m];
        memset(dp, 0, sizeof(dp));
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < m; ++j){
                if(j == 0){//第一列(特殊情况,只能从上边移)
                    dp[j] += grid[i][j];
                }
                else if(i == 0){//第一行(特殊情况,只能从左边移)
                    dp[j] = dp[j - 1] + grid[i][j];
                }
                else{//可以从左边或上边移
                    dp[j] = min(dp[j] + grid[i][j], dp[j - 1] + grid[i][j]);
                }
            }
        }
        return dp[m - 1];
    }
};

执行结果

执行结果1

你可能感兴趣的:(LeetCode)