https://leetcode.com/problems/minimum-path-sum/
该题看到题目,计算最小值,第一反应就是dp解法.
对于不是第0行或者第0列的grid,有两种方法到[m][n],即为上方到达,或者左边到达,因此dp[m][n]等于上面两种方法的最小dp,加上当前节点的值。但是对于第一行和第一列则就是前面的dp加上当前节点的值。
推导出的dp公式为:
dp[m][n] :
对于m == 0, dp[0][n] = dp[0][n - 1] + grid[0][n];
对于n == 0, dp[m][0] = dp[m - 1][0] + grid[m][0];
m > 0 && n > 0, dp[m][n] = grid[m][n] + Math.min(dp[m - 1][n], dp[m][n - 1]).
计算出来的dp值为下表所示,最后一个dp值为7:
1(1) | 3(1 + 3 = 4) | 1(4 + 1 = 5) |
1(1 + 1 = 2) | 5(2 + 5 = 7) | 1(5 + 1 = 6) |
4(2 + 4 = 6) | 2(6 + 2 = 8) | 1(6 + 1 = 7) |
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = grid[0][0];
for (int i = 0; i < grid.length; i++) // 行
for (int j = 0; j < grid[0].length; j++) { // 列
if (i == 0 && j > 0) dp[0][j] = grid[0][j] + dp[0][j - 1];
else if (j == 0 && i > 0) dp[i][0] = grid[i][0] + dp[i - 1][0];
else if (i > 0 && j > 0) {
dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]);
}
}
return dp[m - 1][n - 1];
}