动态规划经典题型,很明显看得出来递推公式为:
vec[i][j] = tmp + grid[i][j](tmp = (vec[i - 1][j] > vec[i][j - 1]) ? vec[i][j - 1] : vec[i - 1][j]);
这题只需要开一个二维数组来保存当前位置的路径和即可,不过要注意一下边界值:
第一行:vec[i][j] = grid[i][j] + vec[i - 1][j];
第一列:vec[i][j] = grid[i][j] + vec[i][j - 1];
核心代码如上,其他就是简单赋值、循环了。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if (!grid.size())
return 0;
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> vec(m, vector<int>(n, 0));
vec[0][0] = grid[0][0];
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (i == 1)
vec[i][j] = grid[i][j] + vec[i - 1][j];
else if (j == 1)
vec[i][j] = grid[i][j] + vec[i][j - 1];
else {
int tmp = (vec[i - 1][j] > vec[i][j - 1]) ? vec[i][j - 1] : vec[i - 1][j];
vec[i][j] = tmp + grid[i][j];
}
}
}
return vec[m - 1][n - 1];
}
};