题目
思路
第一步,首先分析问题,我们如果要找到路径跑到最后一行的最优状态,
我们得知道他先前的状态dp[i-1],
通过此题我们得知dp(matrix,i,j)是dp(matrix,i-1,j)和dp(matrix,i-1,j-1)和dp(matrix,i,j+1)
三种状态取最小值过来的
然后我们就取得了最后一行每一个空的最小值,最后我们只需遍历比较取最小值即可
代码
package LeetCode.labuladong.Dynamic;
import java.util.Arrays;
/**
@Description:
第一步,首先分析问题,我们如果要找到路径跑到最后一行的最优状态,
我们得知道他先前的状态dp[i-1],
通过此题我们得知dp(matrix,i,j)是dp(matrix,i-1,j)和dp(matrix,i-1,j-1)和dp(matrix,i,j+1)
三种状态取最小值过来的
然后我们就取得了最后一行每一个空的最小值,最后我们只需遍历比较即可
@Author: WangHaopeng
@date 2022/1/9
@time 20:33
@Version 1.0
*/
class Solution {
int[][] memo;
public int minFallingPathSum(int[][] matrix) {
int n = matrix.length;
int res = Integer.MAX_VALUE;
//创建备忘录
memo = new int[n][n];
//然后填充这个数组
for (int i = 0; i <n ; i++) {
Arrays.fill(memo[i],66666);
}
//调用dp找出最后一行所有的值里面的最小值
for (int i = 0; i <n ; i++) {
res = Math.min(res,dp(matrix,n-1,i));
}
return res;
}
public int dp(int[][] matrix, int i,int j){
//在dp里面对每一个状态的之前的三个状态进行判别
//首先要判断i,j和length是否越界
if (i<0||j<0||i>=matrix.length||j>=matrix[0].length){
return 99999;
}
//漏了一种情况 base case
//如果i为第0行需要设置初始值
if (i==0){
return matrix[0][j];
}
//备忘录如果存在这个数就返回
if (memo[i][j]!=66666){
return memo[i][j];
}
//正常规划matrix[i][j]在
//dp(matrix,i-1,j)和dp(matrix,i-1,j-1)和dp(matrix,i-1,j+1)
//求最小值
memo[i][j] = matrix[i][j]+min(
dp(matrix, i-1, j),
dp(matrix, i-1, j+1),
dp(matrix, i-1, j-1)
);
return memo[i][j];
}
//三者求最小值
int min(int a,int b,int c){
int min = Math.min(a, Math.min(b, c));
return min;
}
}