【动态规划】:路径问题_下降路径最小和

朋友们、伙计们,我们又见面了,本专栏是关于各种算法的解析,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 题目解析

2. 算法原理讲解

2.1 状态表示

2.2 状态转移方程

2.3 初始化

2.4 填表顺序

2.5 返回值

3. 代码实现 

4. 算法复杂度


1. 题目解析

LeetCode931.下降路径最小和:https://leetcode.cn/problems/minimum-falling-path-sum/description/icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-falling-path-sum/description/

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

通过题目描述:首先这个方形二维数组是正方形,并且位于当前位置时,下一步只能走左下方、正下方、右下方走。

2. 算法原理讲解

本题我们采用动态规划的思想解题:路径问题的解题思路一般是以某一位置为结尾或者以某一位置为开始进行描述。

2.1 状态表示

根据题目要求:我们采用以某一位置为结尾进行描述;

以dp[i][j]为结尾 + 题目要求

所以dp[i][j]:表示到达[i][j]位置时,最小下降路径和

2.2 状态转移方程

根据题意,能到达[i, j]位置有三条路径,从左上方走下来、从正上方走下来、从右上方走下来,所以要从这三条路径里面选择最小的一条,假设从左上方[i-1, j-1]走下来路径和最小,那么走到[i-1, j-1]要保证最小路径和就呼应了我们的状态表示dp[i-1][j-1]。

                                        左上方(x) dp[i-1][j-1]到达dp[i][j]    =>  dp[i-1][j-1] + matrix[i][j]

到达dp[i][j]有三条路径     正上方(y) dp[i-1][j]到达dp[i][j]       => dp[i-1][j-1] + matrix[i][j]

                                        右上方(z) dp[i-1][j+1]到达dp[i][j]   => dp[i-1][j-1] + matrix[i][j]

dp[i][j] = min(x, y, z) + matrix[i][j]

2.3 初始化

由于我们的状态转移方程需要用到左上方、右上方、正上方的数据,如果我们直接初始化:需要将最左边一列和最右边一列以及最上面一行初始化,这样初始化很麻烦:

所以我们在创建dp表时多开一行,多开两列

根据状态转移方程和状态表示,为了不影响后续填表的正确性,我们需要将第一行初始化为0,因为我们需要找三条路径中最小的,第一行都置为0不影响我们的填表,剩余两列初始化为INT_MAX也就是正无穷即可。

需要注意的时,填表的时候需要将matrix中的行和列减一,因为我们的dp表创建时就比原来大了。

2.4 填表顺序

根据状态转移方程可以看出填表顺序是从上往下

2.5 返回值

在计算到最后一行时,每个位置都代表了从上面到最小面的路径和,所以我们需要选出最小的进行返回

3. 代码实现 

为了初始化方便,我们可以将所有的值先初始化为正无穷,然后再将第一行初始化为0即可。

class Solution 
{
public:int minFallingPathSum(vector<vector<int>>& matrix) {int n = matrix.size();// 创建dp表vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));  // 初始化for(int j = 0; j<=n;j++) dp[0][j] = 0;// 填表for(int i = 1; i <= n; i++)for(int j = 1; j<= n; j++)dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];int result = INT_MAX;  // 获取最后一行的最小路径和for(int i = 1; i <= n + 1; i++)result = min(result, dp[n][i]);return result;}
};

4. 算法复杂度

两层for循环:时间复杂度0(N^2)

二维dp表:    空间复杂度O(N^2)

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL学习——17.模型

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

C# CAD交互界面-自定义面板集-comboBox选择图层

运行环境Visual Studio 2022 c# cad2016 一、代码说明 SelectLayer方法是一个自定义的AutoCAD命令方法&#xff0c;通过[CommandMethod("SelectLayer")]进行标记。方法首先获取当前活动文档&#xff0c;并检查是否有效。创建一个名为"SelectLayer"的Pale…

【复现】XMall 开源商城 SQL注入漏洞_54

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 XMall基于SOA架构的分布式电商购物商城 前后端分离 前台商城:Vue全家桶 后台管理系统 二 .漏洞影响 攻击者未经授权可以访问数据库…

ES 在单个节点的查询并发限制是多少?增加分片一定会提高聚合/查询速度吗

背景 对于搜索集群而言&#xff0c;小节点多节点化一般是最佳实践。对于OLAP/日志集群而言&#xff0c;难以避免使用大节点&#xff08;单节点高配置&#xff09;&#xff0c;因为太多节点容易造成master的压力。对于OLAP集群而言单节点可能存在数百甚至数千shard。此时我们就…

使用 RAG 创建 LLM 应用程序

如果您考虑为您的文件或网站制作一个能够回应您的个性化机器人&#xff0c;那么您来对地方了。我可以帮助您使用Langchain和RAG策略来创建这样一个机器人。 了解ChatGPT的局限性和LLMs ChatGPT和其他大型语言模型&#xff08;LLMs&#xff09;经过广泛训练&#xff0c;以理解…

Leetcoder Day16| 二叉树 part05

语言&#xff1a;Java/C 513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 本题需要满足两…

在vue事件中传入$event,使用e.target和e.currentTarget有什么区别

在Vue中&#xff0c;事件处理是前端开发中非常重要的一部分。当我们在Vue中处理事件时&#xff0c;经常会用到事件对象event&#xff0c;而在事件对象中&#xff0c;有两个常用的属性&#xff1a;e.target和e.currentTarget。这两个属性在使用上有些细微的差别&#xff0c;本文…

备战蓝桥杯---数学之矩阵快速幂基础

我们先不妨看一道题&#xff1a; 看见n的数据范围就知道直接按以前的递归写肯定狗带&#xff0c;那我们有什么其他的方法吗&#xff1f; 下面是分析&#xff1a; 我们就拿斐波那契数列试试手吧&#xff1a; 下面是AC代码&#xff0c;可以当作模板记&#xff1a; #include<b…

qt-交通路口仿真

qt-交通路口仿真 一、演示效果二、核心代码三、程序链接 一、演示效果 二、核心代码 #include "generator.h"Generator::Generator(SimulationScene *scene):m_scene(scene),m_mode(VEHICLEMETHOD::GO_THROUGH),m_running_state(false),m_VisionOn(false),m_IsInter…

HTML元素和属性快速参考指南

​ 以下是几个与HTML元素和属性相关的参考资料网站链接&#xff1a; HTML Reference - 提供所有HTML元素和属性的免费指南。W3Schools HTML Reference - W3Schools 提供一个广泛的HTML标签和属性参考。freeCodeCamp HTML Cheat Sheet - freeCodeCamp 提供了一个HTML元素列表参…

【Label Studio运行报错】ModuleNotFoundError: No module named ‘google.rpc‘

报错截图&#xff1a; 解决方法&#xff1a; 新建虚拟环境&#xff0c;安装google相关包 pip install google-cloud-core google-cloud-storage把虚拟环境中site-packages下google文件夹拷贝到当前环境的对应位置下。去官网下载最新的sqlite3&#xff0c;复制到AppData\Loca…

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin 红色线框区域即为选中的原图中心区域&#xff0c;放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

163邮箱发邮件

1、Jenkins安装Email Extension Plugin 2、网易邮箱里获取授权码:qa_jenkins_robot@163.com 开启POP3/SMTP 我已经配置过了,所以这里会有一个使用设备 3、配置Jenkins邮箱通知 Manage Jnekins-Configuration System Jenkins Location: Extended E-mail Notification: …

【MySQL】如何处理DB读写分离数据不一致问题?

文章内容 1、前言读写库数据不一致问题我们如何解决&#xff1f;方案一&#xff1a;利用数据库自身特性方案二&#xff1a;不解决方案三&#xff1a;客户端保存法方案四&#xff1a;缓存标记法方案五&#xff1a;本地缓存标记 那DB读写分离情况下&#xff0c;如何解决缓存和数据…

【最新Dubbo3深入理解】Dubbo特性、工作原理以及负载均衡策略

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

代码随想录算法训练营第56天 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

最长递增子序列 这里dp数组的定义比较难想。dp[i] 表示 i 之前的序列中以 nums[i] 结尾的最长递增子序列长度&#xff0c;只有这样才能实现状态递推。对于dp数组初始化&#xff0c;所有下标位置都应该初始化为1。 class Solution{ public:int lengthOfLIS(vector<int>&a…

课后延时服务选课报名管理系统功能清单

课后延时服务选课报名管理系统分为学校端&#xff0c;培训机构端&#xff0c;家长端。 学校端提供学生管理&#xff0c;课程管理&#xff0c;班级管理&#xff0c;班级排课&#xff0c;班级课表&#xff0c;可直接安排学生入班上课&#xff0c;查看学生考勤情况&#xff0c;查…

网关服务gateway注册Consul时报错Consul service ids must not be empty

网关服务gateway启动时&#xff0c;初始化Consul相关配置时报错。 Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: cbda-server-gateway:10.111.236.142:…

stm32学习笔记-STLINK使用

stm32学习笔记-STLINK使用 使用ST-LINK调试程序进度表格 使用ST-LINK调试程序 说明 组成 总结 记录使用STLINK进行项目的烧写和调试&#xff0c;旨在高效的进行代码调试学习工具包括笔记本、keil5MDK、stm32f030c8t6电表主机、STLINK V2、导线、电表代码总的来说&#xff0…

深度学习图像算法工程师--面试准备(1)

1 请问人工神经网络中为什么 ReLU 要好过于 tanh 和 Sigmoid function&#xff1f; 采⽤Sigmoid 等函数&#xff0c;算激活函数时&#xff08;指数运算&#xff09;&#xff0c;计算量⼤&#xff0c;反向传播求误差梯度时&#xff0c;求导涉及除法和指数运算&#xff0c;计算量…