package DP;
public class _64_minPathSum {
// 1. 递归-dfs
private int helper(int[][] grid, int i, int j){
if (i == grid.length - 1 && j == grid[0].length -1){
return grid[i][j];
}
int rowRes = Integer.MAX_VALUE;
int colRes = Integer.MAX_VALUE;
if (i < grid.length - 1){
rowRes = helper(grid, i+1, j);
}
if (j < grid[0].length - 1){
colRes = helper(grid, i, j+1);
}
// 往下走和往右走的最小值加上当前值。
int res = Math.min(rowRes, colRes) + grid[i][j];
return res;
}
// 2. 递归+记忆化
private int helper(int[][] grid, int i, int j, int[][] mem){
/**
* 递归终止条件,极右下角的值返回
*/
if (i == grid.length - 1 && j == grid[0].length -1){
return grid[i][j];
}
/**
* 已经保存,则直接返回
*/
if (mem[i][j] != 0){
return mem[i][j];
}
//否则
int rowRes = Integer.MAX_VALUE;
int colRes = Integer.MAX_VALUE;
if (i < grid.length - 1){
rowRes = helper(grid, i+1, j, mem);
}
if (j < grid[0].length - 1){
colRes = helper(grid, i, j+1, mem);
}
// 往下走和往右走的最小值加上当前值。
mem[i][j] = Math.min(rowRes, colRes) + grid[i][j];
return mem[i][j];
}
// 3. DP bottom_2_up
private int helper(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];
}
public int minPathSum(int[][] grid){
// return helper(grid, 0, 0);
// int[][] mem = new int[grid.length][grid[0].length];
// return helper(grid, 0, 0, mem);
return helper(grid);
}
public static void main(String[] args) {
int[][] grid = {{1, 3, 1},{1, 5, 1}, {4, 2, 1}};
System.out.println(new _64_minPathSum().minPathSum(grid));
}
}
Leetcode_64_minPathSum_矩阵的最小路径和
最新推荐文章于 2021-06-30 10:32:42 发布