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.
Example 1:
[[1,3,1], [1,5,1], [4,2,1]]Given the above grid map, return
7
. Because the path 1→3→1→1→1 minimizes the sum.
解法:
这是一个典型的DP问题。假设到达点的最小路径和(i, j)
为S[i][j]
,则状态方程为S[i][j] = min(S[i - 1][j], S[i][j - 1]) + grid[i][j]
。
那么需要处理一些边界条件。边界条件发生在最上面的行(S[i - 1][j]
不存在)和最左边的列(S[i][j - 1]
不存在)上。假设grid
是这样的[1, 1, 1, 1]
,那么到达每个点的最小和就是前一个点的积累,结果就是[1, 2, 3, 4]
。
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<int> cur(m, grid[0][0]);
for (int i = 1; i < m; i++)
cur[i] = cur[i - 1] + grid[i][0];
for (int j = 1; j < n; j++) {
cur[0] += grid[0][j];
for (int i = 1; i < m; i++)
cur[i] = min(cur[i - 1], cur[i]) + grid[i][j];
}
return cur[m - 1];
}
};