递推
class Solution {
public int minPathSum(int[][] grid) {
int row = grid.length;
if(row == 0) return -1;
int col = grid[0].length;
if(row==1 && col==1) return grid[0][0];
int[][] sum = new int[row][col];
sum[0][0]=grid[0][0];
for(int i = 1; i<col ; i++) sum[0][i] = grid[0][i]+sum[0][i-1];
for(int i = 1; i<row ; i++) sum[i][0] = grid[i][0]+sum[i-1][0];
for(int i = 1 ; i < row ; i++){
for(int j = 1 ; j < col ; j++){
sum[i][j]=Math.min(sum[i-1][j],sum[i][j-1])+grid[i][j];
}
}
return sum[row-1][col-1];
}
}
记忆+递归
class Solution {
public int minPathSum(int[][] grid) {
int[][] memo = new int[grid.length][grid[0].length];
for (int i=0; i<grid.length; i++) {
Arrays.fill(memo[i], -1);
}
return dfs(grid, 0, 0, memo);
}
int dfs(int[][] grid, int i, int j, int[][] memo) {
int m = grid.length, n = grid[0].length;
if (i < 0 || i >= m || j < 0 || j >= n) return Integer.MAX_VALUE;
if (i == m - 1 && j == n - 1) return grid[i][j];
if (memo[i][j] != -1) {
return memo[i][j];
}
int bottom = dfs(grid, i+1, j, memo);
int right = dfs(grid, i, j+1, memo);
memo[i][j] = grid[i][j] + Math.min(bottom, right);
return memo[i][j];
}
}