【动态规划】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.hqwc.cn/news/288583.html

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

相关文章

Python 操作mysql实现事务处理

一、应用场景 Python项目对MySQL数据库进行增、删、改操作时&#xff0c;有时会出现执行sql异常的情况。在批量提交数据的时候&#xff0c;如果其中一个事务提交错误&#xff0c;往往导致预期的整个数据链不完整。 例如银行转账数据&#xff0c;用户A向用户B转账&#xff1a; …

Navicat16的下载与安装

Navicat16的下载与安装 1、官网下载地址&#xff1a;https://www.navicat.com.cn/download/navicat-premium 当然有的朋友在官网下载比较慢&#xff0c;我也为大家准备好了百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1dUcTSHr3761Oayh0-WfolA?pwdwfpl 提取码&am…

【Java】常用的时间类API

目录 Date(时间和日期) SimpleDateFormat&#xff08;解析字符串时间成为时间对象&#xff09; Calendar(系统此刻时间对应的日历) LocalDate&#xff08;年、月、日&#xff09; LocalTime&#xff08;时、分、秒&#xff09; LocalDateTime&#xff08;年、月、日、时、分、秒…

LeetCode 每日一题 Day 17 || 二分

1901. 寻找峰值 II 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat &#xff0c;其中任意两个相邻格子的值都 不相同 。找出 任意一个 峰值 mat[i][j] 并 返回其位置 [i,j] 。 你可以假设整个矩阵周…

vue 如何实现拖动:vue-draggable

vue-draggable 官方文档&#xff1a;传送门 特点&#xff1a; 支持触摸设备&#xff08;如vue项目的移动端开发Quasar&#xff09;支持拖拽和选择文本支持不同列表之间的拖拽视图模型的同步刷新与vue2的过渡动画&#xff08;transition-group&#xff09;兼容有很多监听函数…

Python MySQL数据库连接实现增删改查

一、应用场景 python项目连接MySQL数据库时&#xff0c;需要第三方库的支持。这篇文章使用的是PyMySQL库&#xff0c;适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 1.导入模块 import pymysql2.连接数据库 db pymysql.connect(hostlocalhost,usercode_s…

甄选的董宇辉,颠覆新东方?

董宇辉又被推向浪尖。 一年前&#xff0c;新东方老师董宇辉出现在东方甄选主播间&#xff0c;用边带货边教英文的方式爆火出圈&#xff0c;成为了东方甄选的活招牌。一年后&#xff0c;一条常规宣发物料引发一场巨大的舆情风波&#xff0c;董宇辉“小作文”事件如闹剧般展开&a…

Java研学-Tomcat服务器

一 Web资源 1 概述 浏览器网页上看到的所有内容都称为web资源&#xff0c;比如文字&#xff0c;图片&#xff0c;音频&#xff0c;视频&#xff0c;链接等等内容。 2 Web资源分类 分类概述使用的技术静态资源静态资源是相对于动态资源而言&#xff0c;是指没有后台数据库、不…

3ds Max渲染贴图丢失?这样操作就能搞定!

当你在使用3ds Max进行渲染时&#xff0c;有时候会遇到贴图丢失的问题&#xff0c;导致模型无法正常显示。这可能是因为你在导入模型或添加贴图时出现了一些错误。不过不用担心&#xff0c;接下来我将向你解释这个问题可能出现的几种原因&#xff0c;同时提供有效的解决方案。 …

视觉问答学习(对比学习-3D点云)

1、基于对比学习的方法 自监督学习&#xff0c;不需要人工标注的类别标签信息&#xff0c;而是利用数据本身提供的监督信息来学习样本数据的特征表达&#xff0c;并用于下游任务。在视觉语言表示学习中&#xff0c;通过对比学习实现图像-文本对齐&#xff0c;这种对齐策略能够…

Web请求与响应

目录 Postman Postman简介 Postman的使用 请求 简单参数 实体参数 数组参数 集合参数 日期参数 Json参数 路径参数 响应 ResponseBody 统一响应结果 Postman Postman简介 postman是一款功能强大的网页调试与发送网页http请求的Chrome插件&#xff0c;常用于进行…

怎么压缩图片大小?

怎么压缩图片大小&#xff1f;图片可以说是现在大家绕不开的一种文件&#xff0c;在我们日常的生活和工作中&#xff0c;图片大小成为了一个经常需要处理的问题。无论是在文件插入、上传还是发送图片时&#xff0c;我们往往都会受到图片大小的限制。现在不管手机还是相机的像素…