【每日一题Day264】LC931下降路径最小和 | dp

简介: 【每日一题Day264】LC931下降路径最小和 | dp

下降路径最小和【LC931】

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

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

image.png

  • 为了方便边界处理,将dp数组左边增加一列,右边增加一列
class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int n = matrix[0].length;
        if (n == 1) return matrix[0][0];
        int[] dp = new int[n + 2];
        System.arraycopy(matrix[0], 0, dp, 1, n);
        dp[0] = dp[n + 1] = Integer.MAX_VALUE;
        int res = Integer.MAX_VALUE;      
        for (int i = 1; i < n; i++){
            int pre = dp[0];
            for (int j = 0; j < n; j++){
                int tmp = pre;
                pre = dp[j + 1];
                dp[j + 1] = Math.min(tmp, Math.min(dp[j + 1], dp[j + 2])) + matrix[i][j];
            }            
        }
        for (int j = 1; j <= n; j++){
            res = Math.min(res, dp[j]);
        }
        return res;
    }
}

image.png

目录
相关文章
|
6月前
【每日一题Day168】LC2427公因子的数目 | 模拟
【每日一题Day168】LC2427公因子的数目 | 模拟
38 1
|
6月前
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
56 0
|
6月前
【每日一题Day342】LC2578最小和分割 | 贪心
【每日一题Day342】LC2578最小和分割 | 贪心
44 0
|
6月前
【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp
【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp
57 0
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
58 0
|
算法
【学会动态规划】下降路径最小和(8)
【学会动态规划】下降路径最小和(8)
40 0
|
6月前
LeetCode题:931下降路径最小和
LeetCode题:931下降路径最小和
45 0
|
6月前
【每日一题Day241】LC1254统计封闭岛屿的数目 | dfs
【每日一题Day241】LC1254统计封闭岛屿的数目 | dfs
46 1
|
6月前
【每日一题Day291】LC1289下降路径最小和 II | dp
【每日一题Day291】LC1289下降路径最小和 II | dp
36 0
|
6月前
【每日一题Day138】LC1653使字符串平衡的最少删除次数 | 前后缀 动态规划
【每日一题Day138】LC1653使字符串平衡的最少删除次数 | 前后缀 动态规划
60 0