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.
这题跟之前的unique paths其实是一回事。都是基本的dynamic programming题。dp就是在于小问题向大问题积累记录,避免直接枚举或者回溯带来的对小问题的重复计算。这一点将会在后续的dp总结博客里解释,此处不做深入。
代码一:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> minpath(grid);
//初始化第一行和第一列
for (int i = 1; i < m; i++) {
minpath[i][0] += minpath[i-1][0];
}
for (int j = 1; j < n; j++) {
minpath[0][j] += minpath[0][j-1];
}
// 逐步递进
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
minpath[i][j] = min(minpath[i-1][j], minpath[i][j-1]) + grid[i][j];
}
}
return minpath[m-1][n-1];
}
当然,这题还能再稍微优化一下,就是不用构造完整二维数组,可以用一维滚动数组完成,节约内存。
代码二:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<int> minpath(n, INT_MAX);
minpath[0] = 0;
//初始化:第一项为0为了累加方便,其他为INT_MAX因为后面有min操作
for (int i = 0; i < m; i++) {
minpath[0] += grid[i][0];
for (int j = 1; j < n; j++) {
minpath[j] = min(minpath[j], minpath[j-1]) + grid[i][j];
}
}
return minpath[n-1];
}