族谱网 头条 人物百科

动态规划

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:599
转发:0
评论:0
概述动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。适用情况最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,...

概述

动态规划在查找有很多 重叠子问题 的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

动态规划只能应用于有 最优子结构 的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。

适用情况

最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。

子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

实例

斐波那契数列(Fibonacci polynomial)

计算斐波那契数列(Fibonacci polynomial)的一个最基础的算法是,直接按照定义计算(函数递归):

当n=5时,fib(5)的计算过程如下:

fib(5)

fib(4) + fib(3)

(fib(3) + fib(2)) + (fib(2) + fib(1))

((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

由上面可以看出,这种算法对于相似的子问题进行了重复的计算,因此不是一种高效的算法。实际上,该算法的运算时间是指数级增长的。 改进的方法是,我们可以通过保存已经算出的子问题的解来避免重复计算:

将前n个已经算出的数保存在数组map中,这样在后面的计算中可以直接应用前面的结果,从而避免了重复计算。算法的运算时间变为 O(n)

背包问题

背包问题作为完全问题,暂时不存在多项式时间算法。动态规划属于背包问题求解最优解的可行方法之一。此外,求解背包问题最优解还有搜索法等,近似解还有贪心法等,分数背包问题有最优贪心解等。 背包问题具有最优子结构和重叠子问题。动态规划一般用于求解背包问题中的整数背包问题(即每种物品所选的个数必须是整数)。 解整数背包问题: 设有n件物品,每件价值记为Pi,每件体积记为Vi,用一个最大容积为Vmax的背包,求装入物品的最大价值。 用一个数组f[i,j]表示取i件商品填充一个容积为j的背包的最大价值,显然问题的解就是f[n,Vmax].

f[i,j]=

对于特例01背包问题(即每件物品最多放1件,否则不放入)的问题,状态转移方程:

f[i,j]=

参考Pascal代码

fori:=1tondoforj:=totvdowntov[i]dof[j]:=max(f[j],f[j-v[i]]+p[i]);writeln(f[totv]);

参考C++代码(不含include和数组声明)

#define max(x,y) x>y?x:y //max宏函数,也可以自己写或者调取algorithmfor(inti=1;i=v[i];j--)f[j]=max(f[j],f[j-v[i]]+p[i]);printf("%d",f[totv]);//或std:cout<

使用动态规划的算法

最长公共子序列

Floyd-Warshall算法

Viterbi算法

外部链接


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 动态语言
语言APLBefungeC#(≥4.0)ChucKClipperColdFusionCurlDdBASE(dBL)ECMAScriptEiffelErlangForthGroovyHarbourHyperCard/HyperTalkandDerivativesIoLISPLogtalkLuaMaudesystemMUMPSOberonObjective-CPerlPHPPliantPOP-11PoplogPikePrologPythonRREALbasicREBOLRubyScalaScratchSmalltalkSnobolSquirrelSuperColliderTclTeXVBScriptVisualBasic9or10VisualFoxProWaterWindowsPowerShellxHarbour
· 动态HTML
应用动态HTML技术根据运行地点,客户端脚本(也称浏览器脚本)和服务器脚本。客户端脚本客户端脚本包括JavaScript技术。是指在某个页面中,通过鼠标点击或键盘操作,与网页产生交互动作;或者在特定时间激发某个事件。客户端脚本在用户的电脑系统里运行。常用于多媒体展示和远程脚本调用。服务器脚本服务器脚本包括ASP,ColdFusion,Perl,PHP,Ruby,WebDNA等技术,一般通过CommonGatewayInterface(CGI)来产生动态页面。通过在HTML表单中填写数据,更改URL地址中的参数,更改浏览器的类型等,每次都可能产生不同的页面,称之为动态页面。最常见的例子包括:产生交互式表单生成类似WebCT的e-learning交互式在线基础培训创建基于浏览器的视频游戏
· 动态编译
参见全美达处理器动态将x86码转成VLIW码。动态再编译(英语:dynamicrecompilation)免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
· 动态平衡
化学上的解释在一个可逆的化学反应中,当正向反应及逆向反应的反应速率相等时就会达致动态平衡。在这个状态下不论生成物及反应物的浓度均没有改变,动态一词意指两个反应仍然在持续进行而非停滞,但刚好两者的速率相等,致使各自的浓度均没有改变,达致平衡状态。生态学上的解释在出生率及死亡率均为等值的情况下,某物种的种群数目维持不变就是一种动态平衡。
· 动态范围
另见音量竞赛高动态范围成像高动态光照渲染

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信