动态规划算法:路径问题

例题一

解法(动态规划):
算法思路:
1. 状态表⽰:
对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,巴拉巴拉;
ii. 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表⽰的⽅式:
dp[i][j] 表⽰:⾛到 [i, j] 位置处,⼀共有多少种⽅式。
2. 状态转移⽅程:
简单分析⼀下。如果 dp[i][j] 表⽰到达 [i, j] 位置的⽅法数,那么到达 [i, j] 位置之前的⼀⼩步,有两种情况:
i. 从 [i, j] 位置的上⽅( [i - 1, j] 的位置)向下⾛⼀步,转移到 [i, j] 位置;
ii. 从 [i, j] 位置的左⽅( [i, j - 1] 的位置)向右⾛⼀步,转移到 [i, j] 位置。
由于我们要求的是有多少种⽅法,因此状态转移⽅程就呼之欲出了: dp[i][j] = dp[i - 1][j]+dp[i][j-1]。
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,「添加⼀⾏」,并且「添加⼀列」后,只需将 dp[0][1] 的位置初始化为 1 即可。
4. 填表顺序:
根据「状态转移⽅程」的推导来看,填表的顺序就是「从上往下」填每⼀⾏,在填写每⼀⾏的时候
「从左往右」。
5. 返回值:
根据「状态表⽰」,我们要返回 dp[m][n] 的值。

例题二

解法(动态规划):
算法思路:
本题为不同路径的变型,只不过有些地⽅有「障碍物」,只要在「状态转移」上稍加修改就可。
1. 状态表⽰:
对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,巴拉巴拉;
ii. 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表⽰的⽅式: dp[i][j] 表⽰:⾛到 [i, j] 位置处,⼀共有多少种⽅式。
2. 状态转移:
简单分析⼀下。如果 dp[i][j] 表⽰到达 [i, j] 位置的⽅法数,那么到达 [i, j] 位置之 前的⼀⼩步,有两种情况:
i. [i, j] 位置的上⽅( [i - 1, j] 的位置)向下⾛⼀步,转移到[i, j] 位置;
ii. [i, j] 位置的左⽅( [i, j - 1] 的位置)向右⾛⼀步,转移到 [i, j] 位置。
但是, [i - 1, j] [i, j - 1] 位置都是可能有障碍的,此时从上⾯或者左边是不可能到达 [i, j] 位置 的,也就是说,此时的⽅法数应该是 0。 由此我们可以得出⼀个结论,只要这个位置上「有障碍物」,那么我们就不需要计算这个位置上的值,直接让它等于 0 即可。
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,添加⼀⾏,并且添加⼀列后,只需将 dp[1][0] 的位置初始化为 1 即可。
4. 填表顺序:
根据「状态转移」的推导,填表的顺序就是「从上往下」填每⼀⾏,每⼀⾏「从左往右」。
5. 返回值:
根据「状态表⽰」,我们要返回的结果是 dp[m][n]

例题三

解法(动态规划):
算法思路:
1. 状态表⽰: 对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,巴拉巴拉;
ii. 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表⽰的⽅式: dp[i][j] 表⽰:⾛到 [i, j] 位置处,此时的最⼤价值。
2. 状态转移⽅程:
对于 dp[i][j] ,我们发现想要到达 [i, j] 位置,有两种⽅式:
i. 从 [i, j] 位置的上⽅ [i - 1, j] 位置,向下⾛⼀步,此时到达 [i, j] 位置能拿到的礼物价值为
dp[i - 1][j] + grid[i][j]
ii. 从 [i, j] 位置的左边 [i, j - 1] 位置,向右⾛⼀步,此时到达 [i, j] 位置能拿到的礼物价值为
dp[i][j - 1] + grid[i][j]
我们要的是最⼤值,因此状态转移⽅程为:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] 。
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。在本题中,「添加⼀⾏」,并且「添加⼀列」后,所有的值都为 0 即可。
4. 填表顺序:
根据「状态转移⽅程」,填表的顺序是「从上往下填写每⼀⾏」,「每⼀⾏从左往右」。
5. 返回值:
根据「状态表⽰」,我们应该返回 dp[m][n] 的值。

例题四

解法(动态规划):
算法思路:
关于这⼀类题,由于我们做过类似的,因此「状态表⽰」以及「状态转移」是⽐较容易分析出来的。 ⽐较难的地⽅可能就是对于「边界条件」的处理。
1. 状态表⽰:
对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,到达⽬标位置有多少种⽅式;
ii. 从起始位置出发,到达 [i, j] 位置,⼀共有多少种⽅式
这⾥选择第⼆种定义状态表⽰的⽅式:dp[i][j] 表⽰:到达 [i, j] 位置时,所有下降路径中的最⼩和。
2. 状态转移⽅程:
对于普遍位置 [i, j] ,根据题意得,到达 [i, j] 位置可能有三种情况:
i. 从正上⽅ [i - 1, j] 位置转移到 [i, j] 位置;
ii. 从左上⽅ [i - 1, j - 1] 位置转移到 [i, j] 位置;
iii. 从右上⽅ [i - 1, j + 1] 位置转移到 [i, j] 位置;
我们要的是三种情况下的「最⼩值」,然后再加上矩阵在 [i, j] 位置的值。
于是 dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j + 1])) + matrix[i][j] 。
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。 在本题中,需要「加上⼀⾏」,并且「加上两列」。所有的位置都初始化为⽆穷⼤,然后将第⼀⾏初始化为 0 即可。
4. 填表顺序:
根据「状态表⽰」,填表的顺序是「从上往下」。
5. 返回值:
注意这⾥不是返回 dp[m][n] 的值!
题⽬要求「只要到达最后⼀⾏」就⾏了,因此这⾥应该返回「 dp 表中最后⼀⾏的最⼩值」。

例题五

解法(动态规划):
算法思路:
像这种表格形式的动态规划,是⾮常容易得到「状态表⽰」以及「状态转移⽅程」的,可以归结到
「不同路径」⼀类的题⾥⾯。
1. 状态表⽰:
对于这种路径类的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,巴拉巴拉;
ii. 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表⽰的⽅式: dp[i][j] 表⽰:到达 [i, j] 位置处,最⼩路径和是多少。
2. 状态转移:
简单分析⼀下。如果 dp[i][j] 表⽰到达 到达 [i, j] 位置处的最⼩路径和,那么到达 [i, j] 位置之前的⼀⼩步,有两种情况:
i. 从 [i - 1, j] 向下⾛⼀步,转移到 [i, j] 位置;
ii. 从 [i, j - 1] 向右⾛⼀步,转移到 [i, j] 位置。
由于到 [i, j] 位置两种情况,并且我们要找的是最⼩路径,因此只需要这两种情况下的最⼩值,再加上 [i, j] 位置上本⾝的值即可。也就是: dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
3. 初始化:可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。 在本题中,「添加⼀⾏」,并且「添加⼀列」后,所有位置的值可以初始化为⽆穷⼤,然后让dp[0][1] = dp[1][0] = 1 即可。
4. 填表顺序:
根据「状态转移⽅程」的推导来看,填表的顺序就是「从上往下」填每⼀⾏,每⼀⾏「从左往后」。
5. 返回值:
根据「状态表⽰」,我们要返回的结果是 dp[m][n]

例题六

解法(动态规划):
算法思路:
1. 状态表⽰:
这道题如果我们定义成:从起点开始,到达 [i, j] 位置的时候,所需的最低初始健康点数。
那么我们分析状态转移的时候会有⼀个问题:那就是我们当前的健康点数还会受到后⾯的路径的影
响。也就是从上往下的状态转移不能很好地解决问题。
这个时候我们要换⼀种状态表⽰:从 [i, j] 位置出发,到达终点时所需要的最低初始健康点数。这样我们在分析状态转移的时候,后续的最佳状态就已经知晓。
综上所述,定义状态表⽰为:dp[i][j] 表⽰:从[i, j]位置出发,到达终点时所需的最低初始健康点数。
2.
状态转移⽅程:
对于 dp[i][j] ,从 [i, j] 位置出发,下⼀步会有两种选择
(为了⽅便理解,设 dp[i][j] 的最终答案是 x ):
i. ⾛到右边,然后⾛向终点
那么我们在 [i, j] 位置的最低健康点数加上这⼀个位置的消耗,应该要⼤于等于右边位置的最低健康点数,也就是: x + dungeon[i][j] >= dp[i][j + 1] 。通过移项可得: x >= dp[i][j + 1] - dungeon[i][j] 。因为我们要的是最⼩值,因此这种情况下的 x = dp[i][j + 1] - dungeon[i][j]
ii. ⾛到下边,然后⾛向终点
那么我们在 [i, j] 位置的最低健康点数加上这⼀个位置的消耗,应该要⼤于等于下边位置的最低健康点数,也就是: x + dungeon[i][j] >= dp[i + 1][j] 。通过移项可得: x >= dp[i + 1][j] - dungeon[i][j] 。因为我们要的是最⼩值,因此这种情况下的 x = dp[i + 1][j] - dungeon[i][j]
综上所述,我们需要的是两种情况下的最⼩值,因此可得状态转移⽅程为:
dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]
但是,如果当前位置的 dungeon[i][j] 是⼀个⽐较⼤的正数的话, dp[i][j] 的值可能变成 0 或者负数。也就是最低点数会⼩于 1 ,那么骑⼠就会死亡。因此我们求出来的 dp[i][j]如果⼩于等于 0 的话,说明此时的最低初始值应该为 1 。处理这种情况仅需让 dp[i][j]与 1 取⼀个最⼤值即可:
dp[i][j] = max(1, dp[i][j])
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。在本题中,在 dp 表最后⾯添加⼀⾏,并且添加⼀列后,所有的值都先初始化为⽆穷⼤,然后让 dp[m][n - 1] = dp[m - 1][n] = 1 即可。
4. 填表顺序:
根据「状态转移⽅程」,我们需要「从下往上填每⼀⾏」,「每⼀⾏从右往左」。
5. 返回值:
根据「状态表⽰」,我们需要返回 dp[0][0] 的值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《自动机理论、语言和计算导论》阅读笔记:p428-p525

《自动机理论、语言和计算导论》学习第 14 天,p428-p525总结,总计 98 页。 一、技术总结 1.Kruskal’s algorithm(克鲁斯克尔算法) 2.NP-Complete Problems p434, We say L is NP-complete if the following statements are true about L: (1)L is …

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多,回来比较晚了,趁着还未开奖,赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下: 百位:2、3、1、5、0、6 十位:4、3、6、8、0、9 个位&#xf…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营,但原有技术公司不想再合作或者不想再维持整个技术团队等原因,就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目,这究竟是什么原因呢&#xff…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日,深圳证券交易所披露的信息显示,东莞六淳智能科技股份有限公司(下称“六淳科技”)及其保荐人撤回上市申请材料。因此,深圳证券交易所决定终止对其首次公开发行…

暂不要创业,谁创业谁死

关注卢松松,会经常给你分享一些我的经验和观点。 卢松松视频号会员专区有个会员提问,我感觉挺有代表性的,写成公众号文章,分享给大家: 松哥,我花了太多时间在思考上,而一直没有行动&#xff…

ESG视角下的多期DID构建(2009-2022年)4.5万+数据

随着ESG信息越来越受到重视,一些第三方评级机构开始推出ESG评级产品,目前在第三方数据库能够查到华证、富时罗素、商道融绿、社会价值投资联盟以及Wind自有的ESG评级数据等。其中,商道融绿是中国最早发布ESG评级数据的机构,也是国…

一文读懂Vue生命周期(Vue2)

一文读懂Vue生命周期(Vue2) 目录 一文读懂Vue生命周期(Vue2)1 前言2 Vue生命周期2.1 基本生命周期2.1.1 8个生命周期2.1.2 案例 2.2 组件生命周期2.2.1 父子生命周期2.2.2 案例 2.3 keep-alive生命周期2.3.1 案例 2.4 其他 3 总结…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙(HarmonyOS)是华为推出的一款分布式操作系统,旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南,帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…

VS Code 远程连接 SSH 服务器

文章目录 一、安装 Remote - SSH 扩展并连接远程主机二、免密连接远程主机1. 生成 SSH 密钥对2. 将公钥复制到远程服务器3. 配置 SSH 客服端4. 连接测试 随着技术的不断迭代更新,在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器(我曾经也是个 …

VueComponent构造函数

//创建school组件——注册给谁 在谁的结构上写const school Vue.extend({name: school,//开发者工具的显示template: <div><h2>学校名称&#xff1a;{{schoolName}}</h2><h2>学校地址&#xff1a;{{adress}}</h2> </div>,//结构data() {…

好用的win10电脑桌面便利贴,桌面便签小工具

在日常办公中&#xff0c;我们经常需要记录重要事项、提醒任务或者临时想法。这时&#xff0c;一款好用的电脑桌面便签或便利贴小工具就显得尤为重要。它们能够帮助我们高效地管理信息&#xff0c;提升工作效率。 那么好用的win10电脑桌面便利贴是哪个呢&#xff1f;电脑桌面便…

算法学习:二分查找

&#x1f525; 引言 在现代计算机科学与软件工程的实践中&#xff0c;高效数据检索是众多应用程序的核心需求之一。二分查找算法&#xff0c;作为解决有序序列查询问题的高效策略&#xff0c;凭借其对数时间复杂度的优越性能&#xff0c;占据着算法领域里举足轻重的地位。本篇内…

It‘s possible that the file was already in use (by a text editor or antivirus)

方法一 删除用户下的.npmrc文件&#xff0c;即不改变全局安装的路径&#xff08;不够好&#xff0c;本质问题仍没有解决&#xff0c;全局还是会安装在C盘&#xff09; 每次都用管理员身份运行命令行&#xff08;不够方便&#xff0c;vscode 下的命令行默认也不是管理员身份运行…

linux通过使用bash脚本同时运行多个命令

1、使用&&或||或;&#xff08;根据需要选择连接符号&#xff09;等来连接多条命令 && -> "与"&#xff0c;一条命令执行出错&#xff0c;则后面命令不执行 || -> "或"&#xff0c;一条命令执行成功&#x…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具&#xff0c;使python可在cmd&#xff08;命令行窗口&#xff0c;WinR后输入cmd&#xff09;中执行 针对 “pip不是内部或外部命令也不是可运行” 问题&#xff0c;需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…

BigDecimal:踩坑

问题描述 两个BigDecimal相除, 抛了异常 原因分析&#xff1a; Java 中使用 BigDecimal 做除法运算的时候&#xff0c;值有可能是无限循环的小数&#xff0c;结果是无限循环的小数&#xff0c;就会抛出上面这个异常。 来看看源码&#xff1a; public BigDecimal divide(BigD…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

SOLIDWORKS Electrical电气智能零部件的运用

电气2D向电气3D转型&#xff0c;3D模型无疑是重中之重&#xff0c;精准、正确的3D模型有利于电线长度、空间大小、耗材的计算。而线槽、导轨因为要根据实际情况裁剪&#xff0c;所以即使同一规格的线槽、导轨&#xff0c;在装配时也得根据实际情况&#xff0c;修改长度&#xf…

AAA、RADIUS、TACACS、Diameter协议介绍

准备软考高级时碰到的一个概念&#xff0c;于是搜集网络资源整理得出此文。 概述 AAA是Authentication、Authorization、Accounting的缩写简称&#xff0c;即认证、授权、记帐。Cisco开发的一个提供网络安全的系统。AAA协议决定哪些用户能够访问服务&#xff0c;以及用户能够…

linux系统-PXE高效批量网络装机

目录 一、PXE概述 PXE批量部署的优点 搭建PXE网络体系的前提条件 二、搭建PXE远程安装服务器 1.修改网络配置 2 .老样子关防火墙&#xff01;&#xff01;&#xff01;&#xff01; 3.确保挂载状态 和yum库 4. 安装TFTP服务 5.修改TFTP服务的配置文件 6.启动服务 7…
最新文章