核心思路
- 只能右 / 下走
- 到达
(i,j)的最小和 = min (上面来,左边来) + 当前格子值 - 第一行、第一列要先累加好
转移方程
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
通俗解释
- 第一列:只能从上边走下来,所以一路累加
- 第一行:只能从左边走过来,一路累加
- 中间格子 :
- 从上面来的代价:
grid[i-1][j] - 从左边来的代价:
grid[i][j-1] - 选小的那个,再加上当前格子数值
- 从上面来的代价:
完整代码实现:
java
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
//第一列累加
for(int i = 1;i<m;i++){
grid[i][0] += grid[i-1][0];
}
//第一行累加
for(int j = 1;j<n;j++){
grid[0][j] += grid[0][j-1];
}
//中间:取上,左较小值 + 当前值
for(int i = 1;i<m;i++){
for(int j =1;j<n;j++){
grid[i][j] += Math.min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
}