动态规划|【路径问题】|931.下降路径最小和

这篇具有很好参考价值的文章主要介绍了动态规划|【路径问题】|931.下降路径最小和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目

题目解析

思路

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

代码


题目

931. 下降路径最小和

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

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

示例 1:

动态规划|【路径问题】|931.下降路径最小和,动态规划 ,动态规划,算法

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

动态规划|【路径问题】|931.下降路径最小和,动态规划 ,动态规划,算法

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

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

题目解析

        题目是给一个n*n的矩阵,矩阵里面有值,从第一行到最后一行,所走过的最小值,从第一行元素的任意一个开始,往最后一行走 ,既然是最小值,那没每次就要挑下一行的最小值走,,而这个不是随便挑的,是以第一行这个位置,在第二行离的最近的三个位置中跳最小的值,图示如下图。

动态规划|【路径问题】|931.下降路径最小和,动态规划 ,动态规划,算法

        如果第一行从1开始走,那么第二行,只能走6,5或者4。每走一步加上该位置的值就行,根据规则走到最后 一行 就算结束,返回最小的那个就行。如果是边界,也就是只有两个位置离它最近。

思路

1.状态表示

        状态表示,我们还是选用最常用的方法——选用以某一个位置为结尾,也就是从第一行走到该位置,题目要求,最小路径,所以状态表示可以看成dp[i][j]——从开始走到该【i,j】位置的最小的下降路径

2.状态转移方程

动态规划|【路径问题】|931.下降路径最小和,动态规划 ,动态规划,算法

        根据最近的一步划分路径,最近的路径,到达【i,j】位置,可以从【i-1,j-1】位置,【i-1,j】或者【i-1,j+1】位置到达,所以应当分三种情况讨论。

a)从【i-1,j-1】位置到达【i,j】位置

        要得到第一行到【i,j】位置的最小路径,就要得到第一行到【i-1,j-1】的最小路径,然后加上【i-1,j-1】位置上面的值就是,第一行到【i,j】位置的最小值。而第一行到【i-1,j-1】位置的最小路径可以用dp[i-1][j-1]表示,

        所以此情况下的状态转移方程就是dp[i][j]=dp[i-1][j-1]+matrix[i-1][j-1]

b)从【i-1,j】位置到达【i,j】位置

        同理,得到这个状态转移方程dp[i][j]=dp[i-1][j]+matrix[i-1][j]

c)从【i-1,j+1】位置到达【i,j】位置

        同理,得到这个状态转移方程dp[i][j]=dp[i-1][j+1]+matrix[i-1][j+1]

然后取这三种情况的最小值。

3.初始化

        初始化是为了让填表的时候不要越界。我们要算第一行到指定位置的路径最小值,也就是算dp[i][j],根据状态转移方程可以看出要算dp[i][j],要先得到dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1],第一行和第一列和最后一列,这三个位置是不全的,所以要初始化第一行和第一列,最后一列的位置。

        之前学过,虚拟节点的方式,把需要的位置补起来,填上能使结果正确的值就行,补虚拟结点的方式,如下图所示。

动态规划|【路径问题】|931.下降路径最小和,动态规划 ,动态规划,算法

        现在要确定里面要填什么值,才能使结果正确,我们先来看不加虚拟结点的时候那里面应该填什么?

        对于第一行,比如:dp[0][0],dp[0][0]表示从第一行到当前位置的最小值,可以看出当前位置就是在第一行,也就是自己到自己,也就等于本身矩阵里面的值,这样 我们将加的第一行虚拟结点赋值为0就可以不影响结果。

        对于第一列和最后一列,对于第一列,从第二行开始,它们只是缺了左上角那个数,其他两个都在,如果不加虚拟结点,也就是说只在这两个结点里面挑一个最小的加上就行,也就是说 虚拟结点里面的值不能影响dp[i][j]的结果 ,虚拟结点里面的值要比其他两个值都大,为了确保起见,应该将虚拟结点赋值为正的无穷大。

动态规划|【路径问题】|931.下降路径最小和,动态规划 ,动态规划,算法

        我们加完之后,还要解决下标映射的问题加了一行,所以就 整体向下挪了一行,左边增加一列,也就是向右挪了一列。

        所以当我们算dp[1][1]的值我们要用martix[0][0]值来计算。

4.填表顺序

填表顺序,还是从上到下,从左到右

5.返回值

因为是要到达最后一行,并且是要最小值,所以我们返回dp表中最后一行的最小值就行

代码

        初始化技巧:我们为了方便初始化,如果我们在定义dp表时,将所有值定义为0,后面初始化的时候要改两列的值,所以这里可以我们一开始就将每个初始化正的无穷大。

int min(int a,int b)
{
  return (a<b)?a:b;
}
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize)
{
    int nummin=INT_MAX;
    int n=matrixColSize[0];

    //创建一个dp表
    int dp[102][102]={INT_MAX};
   
    //初始化
     for(int i=0;i<102;i++)
        for(int j=0;j<102;j++)
        {
            dp[i][j]=INT_MAX;
        }
     for(int j=0;j<n+2;j++)dp[0][j]=0;
     

     //填表 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
        dp[i][j]=min(   min(dp[i-1][j],dp[i-1][j-1])  ,   dp[i-1][j+1]   )   +matrix[i-1][j-1];
        }
    }


    for(int j=1;j<=n;j++)
    {
        nummin=min(nummin,dp[n][j]);
    }

    return nummin;
}

空间复杂度:O()

时间复杂度:O()文章来源地址https://www.toymoban.com/news/detail-849552.html

到了这里,关于动态规划|【路径问题】|931.下降路径最小和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法|动态规划No.17】leetcode64. 最小路径和

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

    2024年02月07日
    浏览(49)
  • 【算法专题】动态规划之路径问题

    题目链接 - Leetcode -62.不同路径 Leetcode -62.不同路径 题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示

    2024年01月24日
    浏览(48)
  • 算法沉淀 —— 动态规划篇(路径问题)

    几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此 1.、状态表示:通常状态表示分为基本分为以下两种,其中更是以第一种为甚。 以i为结尾 ,dp[i] 表示什么,通常为代求问题(具体依题目而定) 以i为开始 ,dp[i]表示什么,通常为代求问题(具

    2024年04月17日
    浏览(44)
  • C++算法 —— 动态规划(2)路径问题

    每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路,看接下来的博客也就更轻松了。当然,我也会尽量在写每一篇时都可以让不懂这个算法的人也能边看边理解。 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅

    2024年02月06日
    浏览(50)
  • 【算法优选】 动态规划之路径问题——贰

    动态规划相关题目都可以参考以下五个步骤进行解答: 状态表⽰ 状态转移⽅程 初始化 填表顺序 返回值 后面题的解答思路也将按照这五个步骤进行讲解。 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的

    2024年02月05日
    浏览(49)
  • 【算法】动态规划中的路径问题

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,如果给算法的难度和复杂度排一个排名,那么动态规划算法一定名列前茅。今天,我们通过由简单到困难的两道题目带大家学会动态规划中的路径问题 好了废话不多说,开始我

    2024年02月05日
    浏览(38)
  • 基础算法之——【动态规划之路径问题】1

    今天更新动态规划路径问题1,后续会继续更新其他有关动态规划的问题!动态规划的路径问题,顾名思义,就是和路径相关的问题。当然,我们是从最简单的找路径开始! 动态规划的使用方法: 1.确定状态并定义状态数组:(i,j)代表什么意思?dp[i][j]又是什么意思? 2.确

    2024年02月07日
    浏览(41)
  • 算法刷刷刷|动态规划篇|509.斐波那契数| 70.爬楼梯| 746.使用最小花费爬楼梯| 62.不同路径| 63不同路径2| 343.正数拆分 | 96.不同的二叉搜索树

    509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 给定 n ,请计算 F(n) 。 70.爬楼梯 746.使用最小花费爬楼梯 给你一个整数

    2023年04月23日
    浏览(57)
  • 【学会动态规划】最小路径和(9)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:64. 最小路径和 - 力扣(Leet

    2024年02月16日
    浏览(36)
  • Java 动态规划 64. 最小路径和

      代码展示:  dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];  该题可以通过动态规划解决,动态规划的题根据以下的5大步骤便可轻松解决         1.状态表示                 题目要求我们计算从起点到最后一个位置的最小路径和,我们可以创建一个dp表,dp【i】【j】表示从

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包