思路:
和题目62. 不同路径-CSDN博客类似,只是状态转移方程和初始化不同。
状态转移方程:dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) + grid[i][j]。
初始化:dp[m - 1][i] 为后缀和, dp[i][n - 1] 为最后一列从下到上的后缀和。
空间优化: dp[j] = min(dp[j], dp[j + 1]) + grid[i][j]。
代码:
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[] dp = new int[n];
dp[n - 1] = grid[m - 1][n - 1];
for(int i = n - 2; i >= 0; i--) {
dp[i] = grid[m - 1][i] + dp[i + 1];
}
for(int i = m - 2; i >= 0; i--) {
dp[n - 1] += grid[i][n - 1];
for(int j = n - 2; j >= 0; j--) {
dp[j] = Math.min(dp[j], dp[j + 1]) + grid[i][j];
}
}
return dp[0];
}
}