LeetCode题:931下降路径最小和

简介: LeetCode题:931下降路径最小和



一、题目要求

931. 下降路径最小和

给你一个 n x n 方形 整数数组 matrix ,请你找出并返回通过 matrix下降路径  最小和

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)(row + 1, col) 或者 (row + 1, col + 1)

示例 1:

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]

输出:13

解释:如图所示,为和最小的两条下降路径


示例 2:

输入:matrix = [[-19,57],[-40,-5]]

输出:-59

解释:如图所示,为和最小的下降路径


提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

二、解题思路

这题我们用动态规划思想解决问题,下面是动态规划的一些定义梳理:

(1)状态表示

       这里找到状态表示是通过:经验 + 题目要求,我们定义dp表里的某一位置,就是从上到下,在到达这个位置时的最小路径和。

(2)状态转移方程

如图:

       假设到达这个位置时,求到这里用的最小路径和,那么就是左上,正上,右上间选一个最小值,加上四角星位置原表的路径值。而左上,正上,右上在dp表中放的都是到达他们位置的最小路径,这也是我们状态表示时的定义。如图:

(3)初始化

      这里,我们再原表基础上要多加1行、2列,其中,第一行可以放0,因为dp对应原表的i j 位置,加上0是不影响这个映射位置要放的值。但是第一列和最后一列就不能放0了,因为定义dp表的位置,都要从左上,正上,右上取出最小值,再加上原表在dp表上映射的位置;所以第一列和最后一列,我们放整型的最大值:Integer.MAX_VALUE。如图:

(4)填表顺序

      从上到下(因为要根据上面的值才能推出当前位置的值),为了方便,再从左到右

(5)返回值

       返回dp表最后一行的最小值


三、代码

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        //1、建立dp表
        int n = matrix.length;//方形的,不用分别求行和列了
        int[][] dp = new int[n + 1][n + 2];
        //2、初始化dp表
        for(int i = 1; i < n + 1; i++) {
            //dp的第一列和最后一列赋值整型的最大值
            dp[i][0] = dp[i][n + 1] = Integer.MAX_VALUE;
        }
        //3、填表
        for(int i = 1; i < n + 1; i++) {
            for(int j = 1; j < n + 1; j++) {
                //左上,上,右上的最小值 + 此时原表的值
                dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];
            }
        }
        //4、返回值
        int min = dp[n][0];
        for(int i = 1; i < n + 1; i++) {
            //找出最后一行(第n行)的最小值,返回这个最小值
            min = Math.min(min, dp[n][i]);
        }
        return min;
    }
}
相关文章
|
2月前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
28 0
|
2月前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
29 0
|
4月前
|
机器人 Python
【Leetcode刷题Python】62. 不同路径
LeetCode 62题 "不同路径" 的Python解决方案,使用动态规划算法计算机器人从网格左上角到右下角的所有可能路径数量。
74 0
|
2月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
22 0
|
4月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
4月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
4月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
52 4
|
4月前
|
存储 Python
【Leetcode刷题Python】滑雪路径消耗时间:Testing Round #16 (Unrated) C. Skier
Leetcode题目"Testing Round #16 (Unrated) C. Skier"的Python解决方案,题目要求计算给定滑雪路径字符串的总耗时,其中未走过的边耗时5秒,走过的边耗时1秒。
57 4
|
4月前
|
存储 Python
【Leetcode刷题Python】1496.判断路径是否相交
Leetcode第1496题"判断路径是否相交"的Python代码实现,通过使用字典存储方向和集合记录访问过的坐标点来检测路径是否与自身相交。
49 2
|
4月前
|
机器人 Python
【Leetcode刷题Python】63. 不同路径 II
LeetCode 63题 "不同路径 II" 的Python解决方案,使用动态规划算法计算在有障碍物的网格中从左上角到右下角的不同路径数量。
27 1