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・ω・)ノ

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

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

相关文章

【SpringBoot】序列化和反序列化介绍

一、认识序列化和反序列化 Serialization&#xff08;序列化&#xff09;是一种将对象以一连串的字节描述的过程&#xff1b;deserialization&#xff08;反序列化&#xff09;是一种将这些字节重建成一个对象的过程。将程序中的对象&#xff0c;放入文件中保存就是序列化&…

回顾 — SFA:简化快速 AlexNet(模糊分类)

模糊图像的样本 一、说明 在本文回顾了基于深度学习的模糊图像分类&#xff08;SFA&#xff09;。在本文中&#xff1a;Simplified-Fast-AlexNet (SFA)旨在对图像是否因散焦模糊、高斯模糊、雾霾模糊或运动模糊而模糊进行分类。 二、大纲 图像模糊建模简要概述简化快速 AlexNet…

vscode 快速打印console.log

第一步 输入这些 {// Print Selected Variabl 为自定义快捷键中需要使用的name&#xff0c;可以自行修改"Print Selected Variable": {"body": ["\nconsole.log("," %c $CLIPBOARD: ,"," background-color: #3756d4; padding:…

action3录制出来的LRF文件的正确打开方式

你会发现使用大疆的产品录制出来的视频会有两种格式&#xff1a;LRF和MP4 这个LRF文件是低分辨率、低码率的预览文件&#xff0c;非常适合预览。 这个文件可以直接通过修改文件后缀转化为.mp4格式

14——1

这句话的意思是&#xff0c;如图中月份12天数23时&#xff0c;就是1223&#xff1b;当月份9天数2时&#xff0c;就是0902. 可以看到在上面给出的数组元素中&#xff0c;并没有连续挨在一起的2023数字元素——就有人可能输出答案0。 所以这里要看一下—— ——子序列的含义&…

云服务器如何选?腾讯云2核2G3M云服务器88元一年!

作为一名程序员&#xff0c;在选择云服务器时&#xff0c;我们需要关注几个要点&#xff1a;网络稳定性、价格以及云服务商的规模。这些要素将直接影响到我们的使用体验和成本效益。接下来&#xff0c;我将为大家推荐一款性价比较高的轻应用云服务器。 腾讯云双11活动 腾讯云…

解密图像处理中的利器——直方图与均衡化

直方图与均衡化是数字图像处理中常用的重要工具&#xff0c;它们能够帮助我们更好地理解和改善图像的亮度分布。本文将首先介绍直方图的基本概念以及其在图像处理中的意义&#xff0c;接着详细阐述直方图均衡化的原理和算法。同时&#xff0c;文章将探讨直方图均衡化在图像增强…

利用网络管理解决方案简化网络运维

当今的网络正朝着提高敏捷性和动态功能的方向发展&#xff0c;以支持高级网络要求和关键业务流程&#xff0c;这导致 IT 基础架构也跨越无线、虚拟和混合环境。但是&#xff0c;随着网络的快速发展&#xff0c;如果没有合适的解决方案&#xff0c;IT 管理员很难管理它们&#x…

基于ChatGPT的文本生成艺术框架—WordArt Designer

WordArt Designer是一个基于gpt-3.5 turbo的艺术字生成框架&#xff0c;包含四个关键模块:LLM引擎、SemTypo、Styltypo和TextTypo模块。由gpt-3.5 turbo驱动的LLM引擎可以解释用户输入&#xff0c;从而将抽象概念转化为具体的设计。 SemTypo模块使用语义概念优化字体设计&…

LoadRunner脚本编写之三(事务函数)

关于脚本的这块&#xff0c;前两篇都在讲C语言&#xff0c;其实&#xff0c;要整理点实用的东西挺难&#xff0c;在应用中多对录制的脚本分析&#xff0c;但对于新手学脚本确实无从下手。 先贴一个脚本&#xff1a; 完整代码&#xff1a; 重点代码部分&#xff1a; Action(…

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——templates模板、静态文件、djang…

如何实现Redisson分布式锁

首先&#xff0c;不要将分布式锁想的太复杂&#xff0c;如果我们只是平时业务中去使用&#xff0c;其实不算难&#xff0c;但是很多人写的文章不能让人快速上手&#xff0c;接下来&#xff0c;一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…

公益SRC实战|SQL注入漏洞攻略

目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站&#xff08;可以查找sql注入漏洞&#xff09; inurl:asp idxx 2.查找网站后台&#xff08;多数有登陆框&#xff0c;可以查找弱口令&#xff0c;暴力破解等漏洞&…

SpringBoot和Spring源码下载

1.下载&#xff1a;在一个空的干净地创建一个文件夹叫springsourcecode&#xff0c;其实叫什么都行的。 git clone https://github.com/spring-projects/spring-framework.git 2.JDK要和gradle匹配 我们要21的&#xff0c;今天为止2023年11月13日&#xff0c;idea是2023.2。 …

考研分享第3期 | 211本378分上岸大连理工电子信息经验贴

考研分享第3期 | 211本378分上岸大连理工电子信息经验贴 一、个人信息 姓名&#xff1a;Ming 本科院校&#xff1a;某211学校电子信息工程学院 电子科学与技术专业 上岸院校&#xff1a;大连理工大学 电子信息与电气工程学部 电子信息&#xff08;0854&#xff09; 择校意…

数据中心:精密空调监控,这招太高效了!

在当今日益复杂的工业环境中&#xff0c;精密空调系统的监控和管理变得至关重要。随着科技的迅猛发展&#xff0c;各行各业对温度、湿度和空气质量等参数的高度控制需求不断增加。 精密空调监控系统通过实时数据采集、分析和反馈&#xff0c;为企业提供了可靠的手段来确保生产环…

settings.json配置

settings.json配置 {"editor.tabSize": 2,"git.ignoreWindowsGit27Warning": true,"workbench.editor.untitled.hint": "hidden","security.workspace.trust.untrustedFiles": "open","[vue]": {"…

dll文件【C#】

加载方法&#xff1a; [DllImport("controlcan.dll")] public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); 文件存放位置&#xff1a; 一般放Debug文件夹下。 运行错误&#xff1a; 原因是CPU位数选择不对&…

不变式和橄榄树-UMLChina建模知识竞赛第4赛季第20轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者…

科普测量开关电源输出波形的三种方法及电源波形自动化测试步骤

开关电源波形测试就是对开关电源的输出波形进行检测和分析&#xff0c;观察开关电源参数变化&#xff0c;以此来判断开关电源的性能是否符合要求。好的开关电源对于设备以及整个电路的正常运行是非常重要的&#xff0c;因此开关电源输出波形测试是开关电源测试的重要环节&#…