• 【算法|动态规划No.16】leetcode931. 下降路径最小和


    个人主页兜里有颗棉花糖
    欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
    收录于专栏【手撕算法系列专栏】【LeetCode
    🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
    🍓希望我们一起努力、成长,共同进步。
    在这里插入图片描述

    点击直接跳转到该题目

    1️⃣题目描述

    给你一个 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

    2️⃣题目解析

    初始化:

    • dp表多开辟了一块空间。这是因为在计算最小下降路径和时,每一行的路径和都依赖于上一行的路径和。为了简化边界条件的处理,我们可以在dp表的第一行和最后一行外分别多开辟一列,将这些额外的空间初始化为INT_MAX。这样,当计算最小路径和时,我们不必特殊处理边界情况,而是统一使用通用的递推公式。(简而言之,多开辟了一行两列的空间

    状态表示:

    • dp[i][j]表示到达(i,j)位置的最小下降路径和

    状态转移方程:

    • dp[i][j] = max(max(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1]) + matrix[i][j]

    返回值:

    • 循环遍历dp表中的所有有效位置ret = min(ret,dp[n][i]);
    for(int i = 1;i <= n;i++)
    {
    	ret = min(ret,dp[n][i]);
    }
    return ret;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3️⃣解题代码

    class Solution {
    public:
        int minFallingPathSum(vector<vector<int>>& matrix) {
            int n = matrix.size();
            vector<vector<int>> dp(n + 1,vector<int>(n + 2,INT_MAX));
            for(int i = 0;i < n + 2;i++) dp[0][i] = 0;
            for(int i = 1;i <= n;i++)
            {
                for(int j = 1;j <= n;j++)
                {
                    int x = dp[i - 1][j - 1],y = dp[i - 1][j],z = dp[i - 1][j + 1];
                    dp[i][j] = matrix[i - 1][j - 1] + min(min(x,y),z);
                }
            }
            int ret = INT_MAX;
            for(int i = 1;i <= n;i++)
            {
                ret = min(ret,dp[n][i]);
            }
            return ret;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    最后通过啦!!!
    在这里插入图片描述

  • 相关阅读:
    客观题:Android基础【基础题】
    SpringBoot+Vue项目校园博客系统
    解析java中的字面量和字符类型
    CC3链分析与复现
    医学图像标注终极指南
    C#服务器端代码
    70.C++虚析构函数
    Java项目:SSM网上家具商城网站系统平台
    隐藏element-ui中tree懒加载叶子节点checkbox(分页懒加载效果)
    极客日报:达摩院实现全球最大AI预训练模型;苹果3nm芯片或将2023年问世;微软官宣加入JCP计划
  • 原文地址:https://blog.csdn.net/m0_74352571/article/details/133707941