漫画:5分钟了解什么是动态规划?

动态规划,英文是DynamicProgramming,简称DP,擅长解决“多阶段决策问题”,利用各个阶段阶段的递推关系,逐个确定每个阶段的最优决策,并最终得到原问题的最优决策。

注意:动态规划往往使用表格来存储中间结果

注意:每一步上几层台阶,都是一个决策问题!

1、将求F(10)这个问题,完美的分解成了F(9)和F(8),找到了局部的最优解,与贪心算法有点像呀。

2、既然F(10)=F(9)+F(8),那么F(9)=F(8)+F(7),依此类推,最终问题被逐渐降低了规模,越来越简单,这也是分治算法的思想。

动态规划的三要素:

1、最优子问题

F(10)=F(9)+F(8),就是F(10)问题的最优子问题,局部的贪心完美的将问题分解,如果得到的F(9)和F(8)都是最优解,那么F(10)一定也是最优解了。

2、边界条件

分解到最后,一定是变成了规模最简单的问题,即F(1)和F(2),这两个问题不能再分解了,不过没关系,他们很简单,用你的小心心算就ok了。

3、状态转移方程(DP方程)

本问题的状态转移方程为:F(n)=F(n-1)+F(n-2),这就是解决问题的核心,使得状态能够“动”起来。

注意:相同颜色的部分代表相同的结果

可以看出来,动态规划算法的核心是DP方程。

所以说,状态转换方程(DP方程)就是算法的核心,那么设计DP方程,要有什么注意的呢?以下列出来几点!

1、最优化子问题

从上面的算法三要素中,可以看出,DP方程是最优子问题中归纳而来的。那么,什么才算“最优子问题”呢?就是说,不管之前决策是否是最优决策,都必须保证从现在开始的决策是在之前的基础上最优。具体的说,我们默认F(8)和F(9)就是最优的,在此基础上,得到最优的F(10)。

2、不影响后续决策

由于上一条我们看到,如果F(8)的决策会影响到F(9)和F(10)的决策,那么F(10)=F(9)+F(8)就不成立了,所以,要一定保证,每个阶段的决策仅受之前决策的影响,但不影响之后阶段的决策。

典型应用1---01背包问题

01背包问题的决策,就是判断第i件物品,装还是不装,哪种决策总价值最大?

那么,我们是否能够定义状态为s[i]呢,用来表示第i件物品决策的最大价值?

答案是不可以的,因为这个状态会影响到后面的决策,换种说法讲,装不装入一个物品,会影响到背包中的剩余空间,所以后面的决策当然会受影响。

典型应用2---最长公共子序列问题(这一问题常被用于比较“相似度”)

决策方式就是判断str1[i]和str2[j]的关系,关系不同,则DP方程不同。

福利时刻

入群参与每周抽奖~

扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!

THE END
1.请解释动态规划算法的原理,并通过一个具体例子进行说明。而使用动态规划,则可以避免重复计算。 具体实现方法是使用一个数组来存储已经计算过的子问题的解,每次计算一个子问题时,先查看该子问题是否已经计算并记录在数组中,如果已经计算过,则直接使用已有的结果,否则进行计算并将结果存入数组中。 通过动态规划算法,我们可以在一次遍历中计算出整个斐波那契数列,大大提高了计算https://easylearn.baidu.com/edu-page/tiangong/questiondetail?id=1792780326003484744&fr=search
2.动态规划实验原理实验报告总结.pptx结果与预期的差异分析实验总结与展望CATALOGUE05通过本次实验,我们深入了解了动态规划的基本原理和应用场景,掌握了如何将问题分解为子问题并解决子问题以解决原问题的策略。深入理解动态规划原理在实验过程中,我们通过编写代码实现了动态规划算法,提高了编程能力和解决问题的能力。提高了编程能力通过解决实际问题,我们培养了https://www.renrendoc.com/paper/306178172.html
3.五大常用算法之二:动态规划算法151CTO博客递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。 https://blog.51cto.com/u_12667998/6544848
4.算法之动态规划(DynamicProgramming)动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关https://www.jianshu.com/p/c94134d39df2
5.彻底搞懂KMP算法原理腾讯云开发者社区彻底搞懂KMP算法原理 简介 KMP算法是什么? 引用自百度百科: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过https://cloud.tencent.com/developer/article/2235837
6.算法动态规划DynamicProgramming从菜鸟到老鸟由上面的图片和小故事可以知道动态规划算法的核心就是记住已经解决过的子问题的解。 动态规划算法的两种形式 上面已经知道动态规划算法的核心是记住已经求过的解,记住求解的方式有两种:①自顶向下的备忘录法②自底向上。 为了说明动态规划的这两种方法,举一个最简单的例子:求斐波拉契数列**Fibonacci **。先看一下这https://blog.csdn.net/u013309870/article/details/75193592
7.Java使用动态规划算法思想解决背包问题java动态规划算法的最优性原理:一个最优决策序列具有这样的性质,不论初始状态和第一步决策如何,对前面的决策所形成的状态而言,其余的决策必须按照前一次决策所产生的新状态构成一个最优决策序列。最优性原理体现为问题的最优子结构特性,对于一个问题,如果能从较小规模的子问题的最优解求得较大规模同类子问题的最优https://www.jb51.net/article/246495.htm
8.科学网—经典的算法回顾1.最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。 2.子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重https://blog.sciencenet.cn/blog-315535-665392.html
9.阿里巴巴算法岗武功秘籍(下)● 棋子在规定走法,规定大小的棋盘上,N步后还在棋盘上的概率,主要考察动态规划 ● 一个NxN的棋盘,一个棋子可以等概率地跳八个方向(和象棋中马一样的跳法)。当这个棋子跳出棋盘范围的时候,就停止。问棋子跳了k步之后,棋子还留在棋盘的概率。 ● 学校男生的概率2/3,女生的概率1/3,男生穿牛仔的概率2/3,https://www.flyai.com/article/928
10.基于V2G的电动汽车有序充放电控制策略参考文献[6]以电动汽车的充电设施为研究控制对象,采用多目标以及分层分区的有序充电优化控制模型。在此基础上,采用序列二次规划算法和动态规划算法进行求解,通过IEEE34节点算例分析验证了模型和算法的有效性。 文中分别从电网侧和用户侧的角度出发,基于V2G构建了不同的电动汽车有序充放电模型,采用粒子群优化算法进行http://qks.cqu.edu.cn/html/cqdxzrcn/2019/1/20190101.htm
11.优化面向智能交通的整数规划问题运筹OR帷幄时空网络建模方法通常采用动态规划方法进行高效求解,动态规划可基于Bellman格式实现[21, 22]。时空网络下的动态规划算法广泛用于自动车路径规划[23, 24],公路传感器选址[25]等问题。 5.二次分配问题的扩展应用 交通运输领域很多问题可归结为指派问题,其中的经典的指派问题又分为线指派问题和二次分配问题两大类。Tjallihttps://www.shangyexinzhi.com/article/5213211.html
12.全局路径规划本系列就从无人驾驶路径规划的这两方面进行展开,对一些经典的算法原理进行介绍,并根据个人的一些理解和想法提出了一些改进的意见,通过Matlab2019对算法进行了仿真和验证。过程中如果有错误的地方,欢迎在评论区留言讨论,如有侵权请及时联系。 那么废话不多说,直接进入第一https://mp.weixin.qq.com/s?__biz=MzU1NjEwMTY0Mw==&mid=2247570745&idx=1&sn=9723558902c987664d082aa332663b82&chksm=fbc9ac5dccbe254b66b4d31e7f0629671d1945835c7f06f3464fb7796532c4ae91e703b36f4f&scene=27