搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
技术管理成长计划(一):角色认知及转身_主计划角色认知
2
深度学习进阶之路 - 从迁移学习到强化学习_深度学习和学习进阶的本质
3
Hadoop的MapReduce详解_hadoop mapreduce
4
web前端顶岗实习总结报告_web前端实习报告
5
使用 Langchain 和 Ollama 的 PDF 聊天机器人分步指南
6
2019年全国电子设计竞赛H题电磁炮之定点打击_电赛电磁炮代码
7
MySQL常见报错及解决方案_invalid default value for 'gender
8
【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube
9
基于单片机的教室智能照明台灯控制系统的设计与实现_基于51单片机的教室智能照明控制设计
10
如何用JAVA如何实现Word、Excel、PPT在线前端预览编辑的功能?_前端在页面上编辑ppt和word的插件
当前位置:
article
> 正文
动态规划算法:路径问题_动态规划 路径规划
作者:知新_RL | 2024-07-26 02:12:42
赞
踩
动态规划 路径规划
例题一
解法(动态规划):
算法思路:
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]
的值。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/883038
推荐阅读
article
【连载】
物
联网
全栈教程-从
云
端到
设备
(十一)---调用
阿里
云
API
,
获取
物
的
属性
。_app使用ope...
物
联网
全栈教程-从
云
端到
设备
(十一)一千千万万的
物
联网
设备
通过ALink协议接入到了
云
端,它们不断地按照ALink协议的...
赞
踩
article
引领“
工作
流时代”的
AI
绘画工具!
Comfyui
零基础入门
操作
教程
_
comfyui
教程
...
Comfyui
,一款基于节点式
工作
流的WebUI,提供了精确的
工作
流定制和高效的图像生成性能。本期,将给大家带来Comf...
赞
踩
article
Elasticsearch
模糊
查询
精讲_
elasticsearch
模糊
查询
...
本文详细介绍了
Elasticsearch
中模糊
查询
的精要内容,包括wildcard、prefix、fuzzy以及exis...
赞
踩
article
Suno
新技能
亮相:完美复刻歌手音色
,
我甚至不敢公开!
_
suno
可以
上传
音频模仿吗...
这首《小芳》: https://
suno
.com/song/575b0b29-b6d9-475f-b993-682710...
赞
踩
article
外骨骼
机器人
混战
:
程天
科技
做“深”,傅利叶智能做“广”_
技程天
e088c2
...
秋招过半,颗粒无收。投递岗位
:
RD19 产品工艺开发工程师线上面试,腾讯会议排队叫号面试面试内容
:
自我介绍,介绍自己的项...
赞
踩
article
使用
python
机器
学习
实战
预测
地震
- 从
数据
收集到模型部署...
虽然我们无法完全
预测
地震
,但我们可以尝试
使用
机器
学习
来构建模型,从而更好地理解
地震
的模式和趋势。在本文中,我们将深入研究...
赞
踩
article
LeetCode 206.
反转
链表
...
链表
经典题目:
反转
链表
。_206.
反转
链表
206.
反转
链表
目录 1.原题链接: 2...
赞
踩
article
分享 5
个
实用的
Java
开源
论坛
系统
!...
推荐 5
个
论坛
类
开源
项目,除了有 1
个
是基于 PHP 开发之外,其他都是基于
Java
,并且大部分都是基于 Spr...
赞
踩
article
(
Window
)
GitHack
下载安装
和使用【CTF工具 渗透测试
网络安全
信息安全
】...
GitHack
是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。渗透测试人员、攻击者,可...
赞
踩
article
python
self
太多_
python
里面
的
self
,
是
谁啊?...
对
,
你没看错
,
这
是
我初学
python
时
的
灵魂发问。我们总会在class
里面
看见
self
,
但
是
感觉他好像也没什么用处
,
就
是
...
赞
踩
article
人类最高质量
客户端
项目
chrome
源码
下载
与
编译
...
人类最高质量的
客户端
项目
chrome
源码
下载
与
编译
对于
客户端
应用来说,google
chrome
应该是人类最高质量的客户...
赞
踩
article
Windows
制作
chromium
便携
版_
chromium
便携
版...
本文介绍了如何在
Windows
上创建Chromium
便携
式版本,包括从镜像网站下载Chromium,编写启动脚本,使用P...
赞
踩
article
全
国产化
异构加速
GPU
服务器
_
国产化
gpu
...
方德高可信
服务器
操作系统、银河麒麟高级
服务器
操作系统、统信
服务器
操作系统、大云企业操作系统(BC-Linux)、凝思安全...
赞
踩
article
将
python
打包
成
exe
文件
_
python
怎么
打包
exe
...
用
python
写了一个删除重复
文件
并放入回收站的功能代码。但是每次都要cmd执行一下`
python
删除重复
文件
.py`...
赞
踩
article
el
ement
ui
中
el
-
form
-
item
的属性
rules
的用法_
el
ement
ui
rule...
在使用Element UI的
el
-
form
组件进行表单验证时,如果同时在
el
-
form
上绑定了
rules
,并且在单独的上...
赞
踩
article
大
数据
与
物
联网
:
区别
与联系_
物
联网
与
大
数据
...
总之,
大
数据
和
物
联网
在信息时代中扮演着重要的角色。
物
联网
则侧重于将各种设备和传感器连接到互
联网
,并通过
数据
交互和分析实现...
赞
踩
article
国产
GPU
_
国产
gpu
芯片
厂家有几个...
景嘉微是设计
国产
GPU
的领军企业,在长沙由国防科技大学作为技术支持,2014年4月,成功研发出国内首款
国产
高可靠、低功耗...
赞
踩
article
活动回顾|
Unstructured
Data
Meetup
北京
场...
7月20日,
北京
Unstructured
Data
Meetup
圆满落下帷幕。这场由向量数据库领军者 Zilliz 举办...
赞
踩
article
tomcat8.5
安装_
tomcat8.5
安装包
...
set JAVA_HOME= C:\Program Files\Java\jdk1.8.0_131set JRE_HOM...
赞
踩
article
Flutter
InkWell
-
Flutter
每周一
组件
_
flutter
.
inkwell
使用
详...
Flutter
Inkwell
使用
详解该文章属于【
Flutter
每周一
组件
】系列,其它
组件
可以查看该系列下的文章,该系列...
赞
踩
相关标签
AI作画
人工智能
AI编程
stable diffusion
AIGC
AI写作
mojo
elasticsearch
大数据
搜索引擎
程序人生
java
机器学习
python
游戏
开发语言
信息可视化
leetcode
链表
算法
编程语言
github
xhtml
html