目录
力扣64. 最小路径和
解析代码
力扣64. 最小路径和
64. 最小路径和
难度 中等
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]] 输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 200
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
}
};
解析代码
和之前的题类似,只是初始化要改一改。
dp[i][j] 表示:到 [i, j] 位置处,此时的最小路径和。
状态转移方程:dp[i][j] = grid[i-1][j-1] + min(dp[i-1][j], dp[i][j-1]);
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
// dp[i][j] 表示:到 [i, j] 位置处,此时的最小路径和
// 初始化,保证填表正确,初始化成INT_MAX是为了不影响第1列和最后1列的比较大小
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX)); // 多开一行一列
dp[0][1] = dp[1][0] = 0; // 初始化保证填表正确,原来填了INT_MAX
for(int i = 1; i <= m; ++i)
{
for(int j = 1; j <= n; ++j)
{
dp[i][j] = grid[i-1][j-1] + min(dp[i-1][j], dp[i][j-1]);
}
}
return dp[m][n];
}
};