64. Minimum Path Sum(最小路径和)
题目大意
Given a m x n
grid filled with non-negative numbers, find a path from top left to bottom right, which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
中文释义
给定一个填充了非负数的 m x n
网格,找到一条从左上角到右下角的路径,使得路径上所有数字的总和最小。
注意:你在任何时候只能向下或向右移动。
示例
- 示例 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
解题思路
使用动态规划(DP)来解决问题。创建一个二维 dp
数组来存储到达每个位置的最小路径和。
步骤说明
- 初始化一个与网格同样大小的
dp
数组,其中dp[i][j]
表示到达位置(i, j)
的最小路径和。 - 遍历网格的每一个位置:
- 更新从上方来的最小路径和。
- 更新从左侧来的最小路径和。
- 选择这两个路径和中较小的一个来更新
dp[i][j]
。
dp
数组的最后一个元素即为到达右下角的最小路径和。
代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
vector<vector<int>> dp(n, vector<int>(m, INT_MAX));
dp[0][0] = grid[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i - 1 >= 0) {
dp[i][j] = min(dp[i][j], dp[i - 1][j] + grid[i][j]);
}
if (j - 1 >= 0) {
dp[i][j] = min(dp[i][j], dp[i][j - 1] + grid[i][j]);
}
}
}
return dp[n - 1][m - 1];
}
};