- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《算法设计与分析》第07章
第7章 动态规划法 7.1 一般方法和基本要素 动态规划法的实质也是将较大问题分解为较小的同类子问题,这一点上它与分治法和贪心法类似。但动态规划法有自己的特点。分治法的子问题相互独立,相同的子问题被重复计算,动态规划法解决这种子问题重叠现象。贪心法要求针对问题设计最优量度标准,但这在很多情况下并不容易。动态规划法利用最优子结构,自底向上从子问题的最优解逐步构造出整个问题的最优解,动态规划则可以处理不具备贪心准则的问题。 引例: Fibonacci数(数列)的计算 其定义为 F0=0, F1=1 , Fn=Fn-1+Fn-2 (n≥2) 计算此数列可由递归函数完成 int fibo(int n){ int f; if (n2) f=n; else f=fibo(n-1)+fibo(n-2); return f; } 当n=6时,函数fibo()的调用过程 改进: int fibo(int n){ int i,f,f0,f1; f0=0;f1=1; for (i=2;i=n;i++) { f=f0+f1;f0=f1;f1=f; } return f; } 关键:避免了重复计算,时间代价O(n) 与贪心算法的比较 生活中的实例.如:立志十年达到人生某一目标. 分析现状,制定长期与短期愿景. 贪心策略: 动态规划策略: 当前~2年 8~10年 2~4年 6~10年 4~6年 4~10年 6~8年 2~10年 8~10年 当前~10 年 7.1动态规划算法的基本要素: 子结构重叠性质:递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。 7.1.3? 多段图问题 多段图的最优子结构 假定(s,v2,v3…vk-1,t)是一条从s到t的最短路径,那么(v2,v3…vk-1,t)一定是从v2到t的一条最短路径。 多段图的向前递推关系 动态规划法每一步的决策依赖于子问题的解。在多段图中,一个阶段的决策与后面所要求解的子问题相关,所以不能直接在某个阶段做出决定。 根据最优子结构特性,我们可以从最后阶段开始采用逐步向前递推的方法,由子问题的最优解计算原问题的最优解。 递推关系:cost(i,j):从i阶段j结点到t的最短路径长度,i是阶段编号,j是i阶段中的结点编号, cost(k,t)=0 cost(i,j)=min{c(j,p)+cost(i+1,p)} j∈Vi,p∈Vi+1 ,j,p ∈E 例如:cost(2,1)=min{c(1,5)+cost(3,5), c(1,6)+cost(3,6), c(1,7)+cost(3,7)} cost(5,11)=0, cost(4,10)=5,d(10)=11, cost(4,9)=2,d(9)=11,cost(4,8)=4, d(8)=11 cost(3,7)=min{6+cost(4,10),5+cost(4,9)}=7, d(7)=9 cost(3,6)=5, d(6)=9, cost(3,5)=7,d(5)=9 cost(2,1)=min{4+cost(3,5),2+cost(3,6),1+cost(3,7)}=7,d(1)=6 cost(2,2)=min{2+cost(3,5),7+cost(3,6)}=9,d(2)=5 cost(2,3)=min{11+cost(3,7)}=18,d(3)=7 cost(2,4)=min{11+cost(3,6),8+cost(3,7)}=15 ,d(4)=7 cost(1,0)=min{9+cost(2,1),7+cost(2,2), 3+cost(2,3), 2+cost(2,4)}=16, d(0)=1 p(0)=0,p(k-1)=n-1=11,p(1)=d(p(0))=d(0)=1; p(2)=d(p(1))=
文档评论(0)