解锁动态规划的奥秘:从零到精通的创新思维解析(3)

解锁动态规划的奥秘:从零到精通的创新思维解析(3)

前言:

小编在前几日书写了关于动态规划习题的博客(PS:其实这些都是我的存稿,我已经好久没写博客了截止到现在,确实摆烂),今天各位继续跟着小编的步伐,走进动态规划的世界,接下来我们将会·讲述一个比较新的动态规划问题:路径问题。

正文:

1.不同路径

1.1.题目来源

本题和之前的题目一样,都是来自于力扣,下面小编给上链接:62. 不同路径 - 力扣(LeetCode)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2.题目解析

和之前的规矩一样,小编先给各位分析一下题目到底想要传达给我们什么信息,其实本题也是很好理解的,这个题目就像我们小学做过的益智游戏一样,此时给定我们一个机器人,此时我们从左上角开始走,想要我们求解走到右下角的方法有几种,此时我们选择往右走,也可以选择往下走,只要走到右下角即可。这就是一个典型的路径问题,通过动态规划我们就可以轻易解决此类问题,下面小编进入本题的思路讲解部分。

1.3.思路讲解

对于动态规划的题目,我们首先需要先设置好一个dp表用于存放数据,此时根据题目分析我们可以知道此时我们需要设置一个二维的dp表,因为我们可以通过行走,也可以通过列走。设置完表后,此时我们就要五步走来解决动态规划的题目了。

1.状态表示

此时我们需要弄清楚此时的dp表是什么,对于线性的dp表示,我们通常可以是经验+题目要求来解决,所以此时我们通过题目分析可以得出dp[i] [j]此时表示到达[I,j]位置时的方法(路径),下面我们依据这个dp表可以构建一个状态转换方程。

2.状态转换方程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时我们对于状态转移方程的分析,同样也是需要借助题目来进行表示,此时我们可以知道到达[i,j]位置时的方法有两种,分别是从上面或者从左边到达,所以此时我们达到[i,j]位置时的路径,可以表示为两个方法之和,那么此时我们就可以得到方程了:

dp[i][j] = dp[i - 1][j] + dp[i][j - 1];  //分别是从左,从上
3.初始化

此时我们写完方程后就要注意细节问题了,此时的初始化问题也很明显,此时如果i或者j为0的话,那么上面和左边就会越界,所以第一个解决方法就是我们把第一排和第一列给全部初始化,但是这样无疑是增加工作量,并且出错的概率会加大,所以小编不推荐这个方法,小编认为本题目最好的求解方法就是:增加虚拟节点的方法来解决初始化问题,简单来说就说我们在创建dp表的时候,多开辟一行一列,此时我们仅需从第二排和第二列初始化即可,这样就避免了越界问题,不过对于增加虚拟节点,我们需要有两个注意事项:

  1. 虚拟节点不会影响后面填表的正确性。
  2. 我们填表的时候需要注意下标的映射(代码会体现)

此时对于1,我们对于虚拟节点的初始化,此时还是蛮好填的,我们只要让第一个节点的上或者左为1即可,因为第一个节点也表示着一条路径,其他位置填零即可,此时我们就做到了填表的正确性。

对于2,此时我们只要记住dp表是多开辟一行一列的,所以我们在使用nums(本题没有)的时候行列减1即可,当然,本题目没有用到它,但是小编后面讲述的其他题需要注意这个点。

4.填表顺序

因为此时我们需要用到前面的元素,所以我们从上到下,从左到右填写即可。

5.返回值

因为本题目是想要达到最后一个位置的方法,所以我们返回dp[m] [n]即可。

以上便是思路讲解,下面我们进入代码讲解。

1.4.代码讲解

此时我们需要先设置好一个dp表,那么我们就需要计算此时给定我们表格的行列,之后多开辟一行一列即可,并且让第一个位置的上面为1即可。

vector<vector<int>> dp(m + 1,vector<int>(n + 1,0));
dp[0][1] = 1;

之后我们就要进入循环,循环的开头是第二行第二列,结尾是第m行,第n列,此时循环里面的内容自然是状态转移方程,填完dp表以后,我们返回表中最后一个元素所代表的方法即可。

for(int i = 1 ; i <= m ;i++){for(int j = 1 ; j <= n ; j++){dp[i][j] = dp[i-1][j] + dp[i][j-1];}   }
return dp[m][n];

1.5.代码展现

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m + 1,vector<int>(n + 1,0));dp[0][1] = 1;for(int i = 1 ; i <= m ;i++){for(int j = 1 ; j <= n ; j++){dp[i][j] = dp[i-1][j] + dp[i][j-1];}   }return dp[m][n];}
};

2.不同的路径Ⅱ

2.1.题目来源

本题同样来自于力扣,下面小编给上链接:63. 不同路径 II - 力扣(LeetCode)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.2.题目解析

本题目其实就是上题的pro版,仅仅就是比上面那题多了一个障碍物,此时无非就是遇到障碍物我们就走不了而已,其他和上一个题目一样,所以我就不用详细讲述本题目所代表的意思了,直接进入本题的思路部分。

2.3.思路讲解

此时的dp的设置也是和上个题目一样,我们需要设置好一个二维的dp表,因为我们可以选择从行走,也可以选择从列走,之后我们依旧是按照五步走来完成本题目的分析。

1.状态表示

此时我们的状态表示其实和上个题目是一样的,他们的差距仅仅体现在状态转移方程,所以一些话我就直接复制了,此时我们需要弄清楚此时的dp表是什么,对于线性的dp表示,我们通常可以是经验+题目要求来解决,所以此时我们通过题目分析可以得出dp[i] [j]此时表示到达[I,j]位置时的方法(路径),下面我们依据这个dp表可以构建一个状态转换方程。

2.状态转换方程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时这里才是两个题目的不同之处,因为本题目增加了障碍物,所以此时我们并不可以直接无脑的从上面到达目的地,从左边达到目的地了,我们到达一个位置的时候需要判断此时这个位置是否有障碍,如果有障碍的话,那么我们之前的路白走了,此时的dp表填0,如果没有障碍物,我们还是和上个题目一样分两种情况到达该位置,上图就很好的表示出了此时的方程分析。

3.初始化

此时我们的初始化也是和上面题目一样,我们通过增加一行一列的虚拟节点来表示此时的dp表,此时我们原来的第一个位置也算一个路径,所以此时我们让它的上边或者左边为1即可,和上个题目一摸一样,只不过此时我们需要注意下标的映射,因为此时我们多建了一行一列,所以此时我们在填表的时候,原数组行列均减一。

4.填表顺序

从上到下,从左到右。

5.返回值

此时我们返回最后一个位置所对应的dp表里面的值即可。

2.4.代码讲解

此时,我们依旧是设置好一个dp表,并且按照上面说的对特定元素进行初始化。

int m = obstacleGrid.size(),n = obstacleGrid[0].size();  //m表示行,n表示列
vector<vector<int>> dp(m + 1,vector<int>(n + 1,0));//多开辟一个放置虚拟结点
dp[0][1] = 1;

之后我们还是循环进行填表,当然,我们在填表的时候应该注意此时数组对应位置的元素是否为0,如果是0的话我们就依旧和上面那个题目一样进行填表,如果是1的话,那么我们也无需设置其为0,因为此时的dp表里面除了特定位置,其余位置均为0(STL中vector的性质)。填完表后,我们返回dp表最后一个位置的元素即可。

for(int i = 1 ; i <= m ; i++){for(int j = 1 ; j <= n ;j++){if(obstacleGrid[i - 1][j - 1] == 0)dp[i][j] = dp[i-1][j] + dp[i][j - 1];}}
return dp[m][n];

2.5.代码展示

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size(),n = obstacleGrid[0].size();  //m表示行,n表示列vector<vector<int>> dp(m + 1,vector<int>(n + 1,0));//多开辟一个放置虚拟结点dp[0][1] = 1;for(int i = 1 ; i <= m ; i++){for(int j = 1 ; j <= n ;j++){if(obstacleGrid[i - 1][j - 1] == 0)dp[i][j] = dp[i-1][j] + dp[i][j - 1];}}return dp[m][n];}
};

3.总结

此时本文到这也就结束了,今天小编讲述的两个题目关联性很强,所以小编推荐各位可以做完第一个题目的时候,先不看我的分析,直接上手第二个题目就可以,因为第二个题也就在方程那部分和第一题有些许的不同,其他的分析方法和第一个题目都是一样的,如果文章有错误的话,请在评论区指出,小编会定时看评论区对本文进行更正,一起刷题的时光总是短暂的,那么各位大佬们,我们下一篇文章见啦!
在这里插入图片描述

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

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

相关文章

UE5仿漫威争锋灵蝶冲刺技能

这两天玩了一下漫威争锋Marvel Rivals&#xff0c;发现是UE5做的&#xff0c;对里面一些角色技能挺感兴趣的&#xff0c;想简单复刻一下技能功能&#xff0c;顺便复习一下学过的知识 首先把摄像机设置调整一下 CameraBoom里搜索lag 把摄像机延迟关掉 &#xff0c;这样摄像机就…

算法题(13):异或变换

审题&#xff1a; 这题的数据量比较大&#xff0c;所以暴力解法肯定是过不了了&#xff0c;我们根据异或运算的性质来找找规律&#xff0c;不难发现他是有循环周期的。 最终我们的周期是一个不小于n的2的最小整数次幂。 疑问一&#xff1a;为什么会有循环&#xff1f; 1.因为这…

oracle: create new database

用database configuration Assistant 引导创建数据库。记得给system,sys 设置自己的口令&#xff0c;便于添加新操作用户。 创建操作用户&#xff1a; -- 别加双引号&#xff0c;否则&#xff0c;无法用 create user geovindu identified by 888888; create user geovin identi…

IntelliJ IDEA 快捷键大全:提升开发效率的利器

目录 一、基础快捷键 1. 文件操作快捷键 2. 编辑&#xff08;Editing&#xff09; 2.1 代码补全与导航 2.2 代码编辑 2.3 代码折叠与展开 3. 查找与替换 4. 调试 5. 版本控制 高级快捷键 重构快捷键&#xff1a;让代码更加优雅 导航快捷键&#xff1a;快速定位代码 …

GOC编程 第2课 简单命令---直走和转弯命令

第2课 简单命令---直走和转弯命令 goc电子课程https://www.51goc.com/static/gocDemo/lesson.html?options%C5%81%C4%98%C5%96%C5%9F%C5%89%C5%89%C5%95%C5%94%C5%B3%C5%9E%C4%98%C4%80%C4%98%C5%94%C5%9F%C5%8D%C4%88%C4%98%C5%87&winNamelesson2 2A 闯关 goc电子课程htt…

MFC/C++学习系列之简单记录9——简单加法

MFC/C学习系列之简单记录9——简单加法 前言界面设计控件添加添加变量添加事件 后台代码总结 前言 基本的一些使用已经了解&#xff0c;那么就做个简单的加法来练手吧&#xff01; 界面设计 控件添加 在工具箱中选择Edit control和Static Text两个控件&#xff0c;分别设置为…

AOP 面向切面编程的实现原理

AOP是基于IOC的Bean加载来实现的&#xff0c;所以理解Spring AOP的初始化必须要先理解Spring IOC的初始化。然后就能找到初始化的流程和aop对应的handler&#xff0c;即parseCustomElement方法找到parse aop:aspectj-autoproxy的handler(org.springframework.aop.config.AopNam…

VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Java开发环境搭建二、VScode下载及安装三、VSCode配置Java环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…

【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…

Go怎么做性能优化工具篇之基准测试

一、什么是基准测试&#xff08;Benchmark&#xff09; 在 Go 中&#xff0c;基准测试是通过创建以 Benchmark 开头的函数&#xff0c;并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口&#xff0c;比如设置测试执行的次数、记录每次执行的…

vulnhub靶场【WhowWantsToBeKing】之1

前言 靶机&#xff1a;whowantstobeking-1&#xff0c;ip地址192.168.1.67 攻击&#xff1a;kali &#xff0c;ip地址192.168.1.16 主机发现 使用arp-sacn -l或者netdiscover -r 192.168.1.1/24扫描 信息收集 使用nmap扫描端口 网站信息探测 访问80端口默认界面&#xff…

Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】

JAVA最新版JDK 23 安装教程详解 Java Development Kit (JDK) 23 是Oracle发布的最新长期支持版本 (LTS) 之一&#xff0c;它带来了许多新特性和改进。 本教程将详细介绍如何在Windows、macOS和Linux系统上安装JDK 23&#xff0c;并涵盖一些常见问题和解决方法。 一、 准备工作…

set的使用

文章目录 一、关联式容器二、set1、set的介绍2、set的使用2.1、元素的插入&#xff08;insert接口&#xff09;2.2、pair的简单讲解2.3、元素的查找&#xff08;find接口&#xff09;2.4、判断元素是否在set中&#xff08;count接口&#xff09;2.5、元素的删除&#xff08;era…

[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)

前言 xshell 链接&#xff1a;https://pan.quark.cn/s/57062561e81a 提取码&#xff1a;TK4K 链接失效&#xff08;可能被官方和谐&#xff09;可评论或私信我重发 安装 下载后解压得到文件 安装路径不要有中文 打开文件 注意&#xff01;360等软件会拦截创建注册表的行为&a…

基于蜂鸟视图的智慧可视化巡检管理系统研究

摘要 本文围绕蜂鸟视图研发的智慧可视化巡检管理系统展开研究&#xff0c;系统依托室内地图和室内定位技术&#xff0c;覆盖“规划、巡场、检查、上报”的完整业务流程。核心功能包括基于蓝牙定位的巡检点位置验证、可视化巡场地图的在线规划与导航、以及巡检路线轨迹的回放分析…

GUI07-学工具栏,懂MVC

MVC模式&#xff0c;是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时&#xff0c;就是他的一生中&#xff0c;最适合开始认识 MVC 模式的好时机之一。这节将安排您学习&#xff1a; Model-View-Controller 模式如何创建工具栏以及…

Chrome 关闭自动添加https

Open Chrome and go to “chrome://net-internals/#hsts”

重拾设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…

gitlab代码推送

点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push

echarts画风向杆

1.安装echarts 2.引入echarts 4.获取数据&#xff0c;转换数据格式 windProfile.title.text ${moment(time.searchTime[0], ‘YYYY-MM-DD HH:mm:ss’).format( ‘YYYY-MM-DD HH:mm’ )}-${moment(time.searchTime[1], ‘YYYY-MM-DD HH:mm:ss’).format(‘YYYY-MM-DD HH:mm’)…