【动态规划】08路径问题_下降路径最小和_C++(medium)

题目链接:leetcode下降路径最小和


目录

题目解析:

算法原理

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

编写代码


题目解析:

题目让我们求通过 matrix 的下降路径  最小和 

由题可得:

在下一行选择的元素和当前行所选元素最多相隔一列

(即位于正下方或者沿对角线向左或者向右的第一个元素)

如图:

我们用示例一分析:

当我们从数字1开始走的时,此时有如上图几种走法;

其他数字也是同理

我们这里只要下降路径 的 最小和,

所以这里我们这里可以得到这两条下降路径和最短:


算法原理:

1.状态表示

先创建一个dp表

首先先思考dp表里面的值所表示的含义(是什么?)

dp[i][j]表示到达[i][j]位置的下降路径的最小和。

这种状态表示怎么来的?

1.经验+题目要求

用之前或者之后的状态,推导出dp[i][j]的值;

根据最近的最近的一步,来划分问题

经验:以[i][j]位置为结尾,用之前的状态推导出dp[i][j]的值

题目要求:求下降路径  最小和

2.状态转移方程

dp[i][j]等于什么?

根据最近的最近的一步,来划分问题

如图,求[i][j]位置的下降路径最小和时,分为三种情况:

第一种:[i-1][j-1]位置加上[i][j]位置的值

我们此时只要用到达[i-1][j-1]位置的下降路径的最小和,再加上[i][j]位置的值(matrix[i][j])就可以得到下降路径最小和。

而这里的“到达[i-1][j-1]位置的下降路径的最小和”正好是我们的状态表示dp[i-1][j-1];

即:dp[i]=dp[i-1][j-1]+matrix[i][j]

第二种:[i-1][j]位置加上[i][j]位置的值

我们此时只要用到达[i-1][j]位置的下降路径的最小和,再加上[i][j]位置的值(matrix[i][j])就可以得到下降路径最小和。

而这里的“到达[i-1][j]位置的下降路径的最小和”正好是我们的状态表示dp[i-1][j];

即:dp[i]=dp[i-1][j]+matrix[i][j]

第三种:[i-1][j+1]位置加上[i][j]位置的值

我们此时只要用到达[i-1][j+1]位置的下降路径的最小和,再加上[i][j]位置的值(matrix[i][j])就可以得到下降路径最小和。

而这里的“到达[i-1][j+1]位置的下降路径的最小和”正好是我们的状态表示dp[i-1][j+1];

即:dp[i]=dp[i-1][j+1]+matrix[i][j]

总结以上三种情况:

因为我们这里要取下降路径的最小和

所以状态转移方程应该为:

dp[i][j]=min({(int)dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]})+matrix[i-1][j-1];

3.初始化

(保证填表的时候不越界)

在0行0列和n列的时候越界,所以我们这里可以在m*n的外围多加1行2列,如图:

还有一个问题是:

我们要拿新增用来初始化的行和列要初始化为几呢?

这里我们需要注意的一点就是在dp[1][1]的时候,最小的下降路径就是他本身

根据状态转移方程,如下图三个位置会影响他的值

为了能够取到他本身,

我们这里需要把这三个位置的其中一个初始化为0,其他的位置初始化为INT_MAX(无穷大)

4.填表顺序

(为了填写当前状态的时候,所需要的状态已经计算过了)

这里所需要的状态是:dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]

所以应该从上到下,从左到右填表

5.返回值

(根据题目要求和状态表示)

综上分析:

返回值为:最后一行的最小值


编写代码:

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {//1.创建dp表//2.初始化//3.填表//4.返回结果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++)dp[i][j]=min({(int)dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]})+matrix[i-1][j-1];int tmp=INT_MAX;for(int i=0;i<=n;i++){tmp=min(tmp,dp[n][i]);}return tmp;    }
};

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

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

相关文章

用户管理第2节课-idea 2023.2 后端--删除表,从零开始

一、鱼皮清空model文件夹下 二、鱼皮清空mapper文件夹下 三、删除 test 测试类下的部分代码 3.1删除SampleTest 3.2删除部分代码 UserCenterApplicationTests

【SQL】根据年份,查询每个月的数据量

根据年份&#xff0c;查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…

DRF从入门到精通二(Request源码分析、DRF之序列化组件)

文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结&#xff1a; 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验 …

mangokit:golang web项目管理工具,使用proto定义http路由和错误

文章目录 前言1、mangokit介绍1.1 根据proto文件生成http路由1.2 根据proto文件生成响应码1.3 使用wire来管理依赖注入 2、mangokit实现2.1 protobuf插件开发2.2 mangokit工具 3、使用示例3.1 创建新项目3.2 添加新的proto文件3.3 代码生成 前言 在使用gin框架开发web应用时&a…

Linux学习(1)——初识Linux

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…

[每周一更]-(第31期):Mysql安装汇总

写自&#xff1a;20230204 23:25 一. mysql rpm二进制包 rpm -Uvh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm yum install mysql-community-server service mysqld start set password password(“123456”)二. mysql yum安装 1、安装查看有没有安装…

开源高星精选,10个2023企业级Python测试项目,再不学习今年没了

纸上得来终觉浅&#xff0c;光学习理论知识是不够的。 想要学好软件测试必须要结合实战项目深入掌握&#xff0c;今天给大家分享十个2023最新企业级Python软件测试项目&#xff1a; ▌Rank 1&#xff1a;Requests-HTML v0.9&#xff08;7385 stars on Github&#xff0c;来自K…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能&#xff0c;需要将对话内容流式返回给前端页面&#xff08;类似GPT的效果&#xff09;。下面直接说下如何实现&#xff1a; 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

以太网的数据速率、互连介质和物理层规范

以太网协议连接已经广泛应用于我们周围的大量事物或设备中。过去&#xff0c;以太网用在局域网 (LAN) 和城域网 (MAN) 中&#xff0c;而如今&#xff0c;由于以太网的普及和多种优势&#xff0c;例如巨大的生态体系和日益增长的规模经济&#xff0c;它越来越多地用在存储和汽车…

鉴赏 tcp vegas

优秀的 vegas 之后&#xff0c;再鉴赏一下迄今唯一像那么回事的拥塞控制算法 vegas。 从下图可看出所有的(对&#xff0c;所有的) aimd 都毫无伸缩性(z:吞吐&#xff0c;x:rtt&#xff0c;y:丢包率&#xff0c;由 buffer_size 直接决定)&#xff1a; 一下就可看出 rtt 和 bu…

(四)pytorch图像识别实战之用resnet18实现花朵分类(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、关于这个实战的一些知识点Q1&#xff1a;图像识别实战常用模块解读Q2:数据增强Q3:迁移学习Q4&#xff1a;平均全局池化Q5&#xff1a;设置哪些层需要训练时…

大一C语言查缺补漏1 12.2

学习方向非C语言方向&#xff0c;但是专业是。。 仅供参考&#xff0c;&#xff0c;祝大家期末考试顺利。 对于二维数组定义&#xff0c;要给出明确的定义 eg&#xff1a;double a [21][4] int a [ ][3] {1,2,3,4,5,6} 不可以是&#xff1a;int a [ ][3]&#xff1b; 在c…

Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

前言 在开发UI滚动列表的时候&#xff0c;经常会有每项的背景图不统一的情况&#xff0c;会间隔重复的情况居多。这种情况下&#xff0c;手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下&#xff0c;笔者尝试写个小工具&#xff0c;在搭建UI时配置一下循环背景的…

《数据结构、算法与应用C++语言描述》- 最小赢者树模板的C++实现

赢者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_30winnerTree 比赛规则 假定有 n 个选手参加一次网球比赛。比赛规则是“突然死亡法”(sudden-death mode)&#xff1a;一名选手只要输掉一场球&#xff0c;就被淘汰。一对一对…

fill-in-the-middle(FIM) 实现与简单应用

1 背景 传统训练的 GPT 模型只能根据前文内容预测后文内容&#xff0c;但有些应用比如代码生成器&#xff0c;需要我们给出上文和下文&#xff0c;使模型可以预测中间的内容&#xff0c;传统训练的 GPT 就不能完成这类任务。 传统训练的 GPT 只能根据上文预测下文 使用 FIM…

vue-element安装富文本编辑器vue-quill-editor教程

在vue ui面板中安装vue-quill-editor依赖 命令安装 npm install vue-quill-editor --save # or yarn add vue-quill-editor 使用方法 在main.js导入富文本编辑器 import VueQuillEditor from vue-quill-editor import quill/dist/quill.core.css // import styles import…

技术博客:市面上加密混淆软件的比较和推荐

技术博客&#xff1a;市面上加密混淆软件的比较和推荐 引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的…

CEC2013(python):五种算法(ABC、PSO、CSO、OOA、DBO)求解CEC2013(python代码)

一、五种算法简介 1、人工蜂群算法 &#xff08;Artificial Bee Colony Algorithm, ABC&#xff09; 2、粒子群优化算法PSO 3、鸡群优化算法CSO 4、鱼鹰优化算法OOA 5、蜣螂优化算法DBO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff…

WINDOWS(WIN11)通过IP添加网络打印机

点击添加设备 点击手动添加 使用IP地址或主机名添加打印机 选择TCP/IP设备&#xff0c;输入打印机地址 如果有正确驱动就安装&#xff0c;没有就取消。 通过手动设置添加本地打印机或网络打印机 使用现有的端口 根据打印机IP&#xff0c;选择标准端口。 成功&#xff01; 到…