Leetcode 64. 最小路径和
思路:
-
状态表示:
- 设 f 为大小 m * n 的矩阵,其中
f[i][j]
代表走到 (i, j) 的路径和
- 设 f 为大小 m * n 的矩阵,其中
-
属性:计算路径和的最小值
-
状态计算:
题目要求,只能向右或向下走,也就是说单元格 (i, j) 只能从左方单元格 (i - 1, j)或者上方单元格 (i, j - 1) 走到,因此只需要考虑矩阵的左边界和上边界
f[i, j]
= “从左方单元格 (i - 1, j) 与从上方单元格 (i, j - 1) 走来的两个最小路径和中较小的” + 当前单元格值grid[i][j]
。具体可以分为以下 4 种情况:- 当左边和上边都不是边界时:
if (i && j) f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i][j]
; - 当只有左边是矩阵边界时:只能从上面来,即:
if (j) f[i][j] = f[i][j - 1] + grid[i][j]
- 当只有上边是矩阵边界时:只能从左边来,即:
if (i) f[i][j] = f[i - 1][j] + grid[i][j]
- 当左边和上边都是边界时,即是起始点:
f[i][j] = grid[i][j]
- 当左边和上边都不是边界时:
代码:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
vector<vector<int>> f(n, vector<int>(m, 1000));
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
if (!i && !j) f[i][j] = grid[i][j];
else
{
if (i) f[i][j] = min(f[i][j], f[i - 1][j] + grid[i][j]);
if (j) f[i][j] = min(f[i][j], f[i][j - 1] + grid[i][j]);
}
}
}
return f[n - 1][m - 1];
}
};