1. 题目
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.
2. 思路
从右下往左上移动,每次计算当前点到右下的最短。
f[i, j] = grid[i, j] + min(f[i+1,j], f[i,j+1])
下边和右边两条边线进行特殊处理。
3. 代码
class Solution {
public:
// 同63题的递归或迭代方案, 避免超时直接采用迭代实现
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
if (m == 0) { return 0; }
int n = grid[0].size();
if (n == 0) { return 0; }
int sol[m+1][n+1];
sol[m-1][n] = 0;
sol[m][n-1] = 0;
int int_max = numeric_limits<int>::max();
for (int i = m-2; i >= 0; i--) {
sol[i][n] = int_max;
}
for (int j = 0; j < n - 1; j++) {
sol[m][j] = int_max;
}
for (int i = m-1; i >= 0; i--) {
for (int j = n-1; j >= 0; j--) {
sol[i][j] = grid[i][j] + min(sol[i+1][j], sol[i][j+1]);
}
}
return sol[0][0];
}
};