动态规划—路径下降和

题目

动态规划—路径下降和

思路

第一步,首先分析问题,我们如果要找到路径跑到最后一行的最优状态
我们得知道他先前的状态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;
    }

}

上一篇:有序矩阵中第k小的元素


下一篇:leetcode2133.检查是否每一行每一列都包含全部整数(简单,周赛)