搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
IT小白
这个屌丝很懒,什么也没留下!
关注作者
热门标签
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
解密Java数据类型与变量
2
JAVAweb入门基础_java web基础
3
MQTT简介之八--mosquitto使用详解_mosquitto 使用
4
MySQL--用Navicat连接MySQL8.0报错1251问题解决_1251报错
5
网络安全专业的就业方向有哪些?_网络安全就业去向
6
3月7日!上海!请领取你的游戏行业线下分享会邀请函
7
Python读取大文件_with读大文件
8
使用ThreadPoolTaskScheduler实现可关闭的定时任务
9
文献学习-10-微创手术机器人的运动学设计考虑因素:综述
10
2023华为OD机试真题【事件推送】_事件推送 华为机试题
当前位置:
article
> 正文
C++ 动态规划 DP教程 (一)思考过程(*/ω\*)
作者:IT小白 | 2024-02-18 19:14:02
赞
踩
C++ 动态规划 DP教程 (一)思考过程(*/ω\*)
动态规划
是一种思维方法
,大家首先要做的就
是
接受这种思维方法,认同他
,然后再去运用它解决新问题。
动态规划是用递推的思路去解决问题。
首先确定问题做一件什么事情?
对这件事情分步完成,分成很多步。
如果我们把整件事称为原问题,那么原问题去掉最后一步后,剩下的问题就称为子问题。
子问题和原问题是同性质的问题,子问题被原问题包含,原问题是在子问题的基础上推进一步得到的,所以用递推去求解。
子问题推进一步,得到原问题。哪些量在变化。这些变化的量用变量表示出来就是问题的状态。
子问题推进一步,这一步做了什么,就是决策。每一步的决策连续起来,就是做整件事的一个方案。
我们来看一道例题吧!ヾ(o・ω・)ノ
例1
:组合问题,从n个不同物体中选择m个,求有多少种选择方案。
思考过程:
1、 题目要我们做一件什么事情?
答:选物体,确切的说是要我们从n个物体中选出m个物体。n和m尽管不知道是多少,但是肯定是一个确定的值,由输入数据确定,所以我们可以假设n=10,m=5,问题是要我们从10个物体中选出5个物体
2、 这件事分多少步去完成?
答:分10步完成,第一步考虑第一个物体选还是不选,第二步考虑第二个物体选还是不选,……,第10步考虑第10个物体选还是不选?
3、 原问题是什么?子问题是什么?
答:
整个问题是:从10个不同物体中选择5个。最后一步是确定第10个物体选还是不选。
如果第10个物体选了,那么去掉这一步,前9步还需要选择4个物体,所以剩下的子问题是从9个物体中选取4个。
如果第10个物体没有选,那么去掉这一步,在前9步还需要选择5个物体,所以剩下的子问题是从9个物体中选取5个。
原问题是10个中选5个,子问题是9个中选4个、9个中选5个
4、 子问题和原问题是同一个性质的问题,用数学符号描述这个问题,需要几个变量才能体系原问题和子问题的差异,各自表示什么含义?
答:原问题和子问题中,备选物体的规模在变化,选出来的物体数目在变化,所以用两个变量来表示问题变化的量:a表示备选物体的数目,b表示选出的物体数目,f(a,b)整个符号的含义就是从a个不同物体中选取b个物体的方案数,这里的f就是表示求解目标,方案数。
很显然,当a取值10,b取值5时,f(10,5)表示原问题,f(9,5)、f(9,4)表示子问题。用问题和子问题都是用同一个模式来表示,这就是状态。
5、 有了状态,我们就可以寻找子问题和原问题之间的递推关系了。
答:
原问题去掉最后一步,得到的子问题,寻找二者之间的关系。
f(a,b)表示从a个不同物体中选取b个,得到的方案数。
对最后一步分两种情况讨论:
选取第a个物体,则方案数等价于从剩下的a-1个物体中选取b-1个,即f(a-1,b-1)
不选第a个物体,则方案数等价于从剩下的a-1个物体中选取b个,即f(a-1,b)
所以得到一个递推方程:f[a,b]=f[a-1,b-1]+f[a-1,b]
6、 状态在计算机中用数组表示,数组第一维下标表示第一个变量,第二维下标表示第二个变量。则一个状态对应一个数组元素,状态之间递推等价于给数组元素递推赋值。
好了看前面的文章,你应该知道了如何思考动态规划的题目!
但是一道题是不够的,要做很多道题,你才能彻底的理解动态规
划的解题思路,从而得到方程,写出代码!ヽ(・ω・´メ)
话不多说,我们再来看一道题目吧!
【洛谷】P1255 数数梯
原题地址:
https://www.luogu.org/problem/P1255
思路:
这个题目隐藏深一些。
题目要我们求等式的个数,我们可以穷举等号右边的和数,如果我们把数列从小到大排列,这样等号左边的数就全部位于穷举的数的左边(想不明白为什么需要排序,暂时可以放一放,假设数列就是已经排好序的)。
对于每个穷举的合数,我们目标是寻找在他左边有多少个合法的式子的和等于他。
思考过程:
1、 题目要我们做一件什么事情?
答:求所有的数学式子,确切的说,当我们穷举第i个和数时,是要我们从i-1个数中选出若干个数,使得这些数的和是a[i]。i是穷举的,是定值。
2、这件事分多少步去完成?
答:分i-1步完成,第一步考虑第一个数选还是不选,第二步考虑第二个数选还是不选,……,第i-1步考虑第i-1个数选还是不选?
3、原问题是什么?子问题是什么?
答:
整个问题是:从i-1个数中选择若干个,使得总和是a[i]。最后一步是确定第i-1个数选还是不选。
如果第i-1个数选了,那么去掉这一步,前i-2步还需要选择若干个数,使得和为a[i]-a[i-1],所以剩下的子问题是从i-2个数中选若干个,使得总和是a[i]-a[i-1]。
如果第i-1个物体没有选,那么去掉这一步,在前i-2步还需要选择若干个数使得总和为a[i],所以剩下的子问题是从i-2个数中选若干个,使得总和是a[i]。
原问题是从i-1个数中选择若干个,使得总和是a[i]。子问题是从i-2个数中选若干个,使得总和是a[i]-a[i-1];i-2个数中选若干个,使得总和是a[i]。
4、子问题和原问题是同一个性质的问题,用数学符号描述这个问题,需要几个变量才能体系原问题和子问题的差异,各自表示什么含义?
答:原问题和子问题中,备选数的规模在变化,选出来的和在变化,所以用两个变量来表示问题变化的量:x表示备选物体的数目,y表示选出的物体数目,f(x,y)整个符号的含义就是从x个数中选若干个使得总和为y的方案数,这里的f就是表示求解目标,方案数。
很显然,当x取值i-1,y取值a[i]时,f(i-1,a[i])表示原问题,f(i-2,a[i]-a[i-1])、f(i-2,a[i])表示子问题。用问题和子问题都是用同一个模式来表示,这就是状态。
5、有了状态,我们就可以寻找子问题和原问题之间的递推关系了。
答:
原问题去掉最后一步,得到的子问题,寻找二者之间的关系。
f(x,y)表示从x个数中选若干个使得和为y,得到的方案数。
对最后一步分两种情况讨论:
选取第x个数,则方案数等价于从剩下的x-1个数中选若干个使得和为y-a[x],即f(x-1,y-a[x])
不选第x个数,则方案数等价于从剩下的x-1个数中选若干个使得和为y,即f(x-1,y)
所以得到一个递推方程:f[x,y]=f[x-1,y-a[x]]+f[x-1,y]
使用该递推方程,可以求每一个阶段的状态
6、状态在计算机中用数组表示,数组第一维下标表示第一个变量,第二维下标表示第二个变量。则一个状态对应一个数组元素,状态之间递推等价于给数组元素递推赋值。
好了,本篇文章就结束了,如果喜欢就记得三连哦φ(>ω<*) ,记得多多做题哦,bye!ヾ(o・ω・)ノ
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/IT小白/article/detail/109981
推荐阅读
article
46 |
研究生
入学率
预测
_
kaggle
入学率
预测
...
该数据集的灵感来自UCLA
研究生
数据集。考试成绩和GPA采用较旧的格式。该数据集归Mohan S Acharya所有。数...
赞
踩
article
按装
MySQL
和
Navicat
(在
windows32
位操作系统下)_32位
winxp
下
navicat
...
第一步:进入mysql官网下载对应版本的安装包 第二步:运行安装包(注意:有可能提示你安装.NET Frame,若提示,...
赞
踩
article
JQUERY
获
取
html
标签中的
属性
值
_
html
jq
取
某个
属性
值
...
jq
uery 获
取
htm标签总的
属性
值
1、 $("#text").attr("value"); //获
取
html
原有
属性
...
赞
踩
article
获取
HTML
元素
的操作方法...
第一种(利用document对象方法):
box
\
[详细] -->
赞
踩
article
【
Axure
】
中
继器
及属性_
axure
中
datacount
...
中
继器
就是临时的数据库,在我们需要当前原型图存储和变更一些数据的时候会经常用到。我们应该如何使用呢?_
axure
中
dat...
赞
踩
article
高级特效
开发
_
col
-{
breakpoint
}-{
number
}...
Bootstrap和React基本运用_
col
-{
breakpoint
}-{
number
}
col
-{
breakpoint
...
赞
踩
article
【仿真】
Carla
之
Docker
运行
及 渲染相关 [6]_
于
carla
版本
拉取映像以在 do...
参考与前言
carla
官方对
于
docker
运行
的描述:CARLA in
Docker
Docker
的使用:[暂时没贴]相关...
赞
踩
article
Qt
4
访问
mysql
数据库
的简单教程_qt
4
使用
mydql
数据库
...
环境:Windows XP qt-sdk-win-opensource-2009.02.exe(
Qt
Creator...
赞
踩
article
时间
序列
实例_
时间
序列
数据
举例...
时间
序列
实例junjun2016年2月12日Rmarkdown脚本及
数据
集:http://pan.baidu.com/s...
赞
踩
article
【
Unity3D
】动态布局之
LayoutGroup
和
LayoutElement
的妙用_
layout
...
需求在一个固定区域中,当Button需要显示时,Text和Button各自按照一定占比占据整个空间,当Button不需要...
赞
踩
article
ubuntu18.04
安装
教程...
文章目录一、下载ubuntu镜像二、准备工作三、配置四、内部系统配置一、下载ubuntu镜像打开
ubuntu18.04
....
赞
踩
article
MySQL
基础知识
(
九)之
视图
...
视图
是一张并不存储数据的虚拟表,其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了
视图
的定义,通过 SQ...
赞
踩
article
vue-
element
实现动态换肤存储_:
export
{
theme
: $
--
color
-pri...
需要实现的效果:选择颜色块或者颜色选择器切换网站主题色,选择主题后保存到本地,下次打开页面是缓存的主题色原理:根据Ele...
赞
踩
article
C++
Qt
开发:
StatusBar
底部
状态栏
组件
_qt
状态栏
...
`Q
StatusBar
` 是
Qt
中用于在主窗口
底部
显示状态信息的部件。它通常用于向用户提供应用程序的当前状态、进度信...
赞
踩
article
区块
链
中
台
详解(
Fabric
)_
业务
中
台
区块
链
...
任何想要篡改记录的人,都必须修改每一个节点的记录,在节点足够多的情况下,这种篡改是无法实现的,这就是
区块
链
防篡改的奥秘。...
赞
踩
article
Unity
制作出《超级
马里奥
》的2D和3D
混合
效果
_
unity
2d
混合
渲染
...
现在来做点别的东西。Nintendo Switch上刚推出的《超级
马里奥
》中,有一些关卡
混合
了2D和3D的画面,这种
效果
...
赞
踩
article
一文读懂
qt
界面设计
(
分裂
器
,
布局
,
拉伸
,
各种属性
设置
)...
现在我们来正式开始讲解。
qt
中能称为
布局
的有如下6个:水平
布局
(QHBoxLayout)垂直
布局
(QVBoxLayout...
赞
踩
article
Python
爬虫
学习——数据
解析
之Re
解析
(七)_
re
结构化
文本数据拆解
python
...
Python
爬虫
学习文章目录
Python
爬虫
学习前言一、正则表达式贪婪匹配和惰性匹配二、Re模块前言三种
解析
方式:1、r...
赞
踩
article
变量
求和
_
中继器
数据
求和
购物车
商品单价合计...
实现步骤: 步骤1:新建1个“
中继器
求和
”页面。步骤2:制作
购物车
原型页面原型中制作两个
中继器
:1个内容为商品名称及图片...
赞
踩
article
unity
改变颜色
透明
通道
实现
闪烁
效果
Unity
闪烁
效果
_
unity
透明
通道
变点点...
Unity
闪烁
功能
_
unity
透明
通道
变点点
unity
透明
通道
变点点 ...
赞
踩
相关标签
数据分析
数据挖掘
python
jquery取值
javascript
axure
开发语言
前端
docker
容器
运维
mysql
数据库
qt
query
opensource
测试
时间序列实例
unity3d
UGUI
游戏开发
ubuntu
vmware
vue.js