- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2010Jul16094824
动态规划常见模型 主讲人:陈宗志 递归的重叠子问题 斐波那契序列: f(1)=1; f(2)=1; f(n)=f(n-1)+f(n-2); (n2) 递归的重叠子问题 斐波那契序列的递归实现: int Fibonacci(int n) { if(n==1||n==2) return 1; return Fibonacci(n-1)+Fibonacci(n-2); } 递归的重叠子问题 f(6)=f(5)+f(4) =f(4)+f(3)+f(4) =f(3)+f(2)+f(3)+f(4) =f(2)+f(1)+f(2)+f(3)+f(4) =3+f(3)+f(4) =3+f(2)+f(1)+f(4) =5+f(4) =5+f(3)+f(2) =5+f(2)+f(1)+f(2)=8 递归的重叠子问题 在上述递归过程中,计算f(6)和f(5)都需要去计算f(4),导致对同一个值f(4)计算了两次,浪费了时间,我们把这种情况叫做递归的重叠子问题. 一种避免递归的重叠子问题的方法就是,当我们求出一个值的时候,就把它保存起来,当下次再用到这个值的时候,直接调用保存的值,而不是再计算一次. 递归的重叠子问题 int num[100]; for(i=0;i100;i++) num[i]=-1; int Fibonacci(int n) { if(num[n]!=-1) return num[n]; if(n==1||n==2) num[n]=1; else num[n]=Fibonacci(n-1)+Fibonacci(n-2); return num[n]; } 练习题一:Function Run Fun(Toj1626). 动态规划 实际上,动态规划的实质就是通过保存计算过的状态,来避免递归的重叠子问题.解决冗余,是动态规划的根本目的. 动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种 状态,所以它的空间复杂度要大于其它的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时 间。 动态规划的适用条件 1.最优化原理(最优子结构性质)最优化原理可以这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。 动态规划的适用条件 2.无后向性将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。 状态和状态转移 状态的选择和状态转移方程是解决动态规划的关键所在. 所谓状态就是问题的实例,比如斐波那契序列中,每一个从1到n的数都代表一个状态.而状态转移就是由一些状态转移到另一个状态,比如斐波那契序列中,可以由状态n-1和n-2转移到状态n.因此,我们就说状态转移方程为:Fibonacci(n)=Fibonacci(n-1)+Fibonacci(n-2). 动态规划的实现 动态规划一般有以下两种实现方法: 1.记忆化搜索:当需要求一个状态时,首先看这个状态是否被计算过,如果计算过,直接使用计算过的值;否则,计算一次,并保存结果. 一般用递归实现,也就是刚才我们求斐波那契序列所使用的方法. 2.递推:所谓递推就是,按照一定顺序将一定范围内的所有状态都计算出来. 一般用非递归的形式实现. 典型问题一:最长上升子序列 问题描述: 给出一个序列,求它最长的上升子序列. 例如,序列{1,7,3,5,9,4,8},其中{1,7}, {3,4,8},{1,3,5,8},都是它的上升子序列,而{1,3,5,8}是它的最长的上升子序列. 最长上升子序列 状态选择: best[i]代表以序列中第i个数为最后一个数时,最长上升子序列的长度. 状态转移方程: best[i]=max{1,max{best[j]+1,num[j]num[i]ji}} 所有best[]值里最大的那个就是最优值. 初始条件: best[i]=1,1=i=n. 最长上升子序列 for(i=1;i=n;i++) best[i]=1; for(i=1;i=n;i++) { for(j=1
您可能关注的文档
最近下载
- 约翰迪尔E210E210LC挖掘机.PDF VIP
- 《明朝一哥王阳明》(吕峥)阅读测试题含答案(推荐).docx VIP
- 地震概论 第三章 地震波传播理论.ppt VIP
- Solutions 第三版分级读物Solutions Intermediate 3ed Workbook Key.pdf VIP
- 《明朝一哥王阳明》(吕峥)阅读测试题(含答案)(推荐).docx VIP
- 四驱车培训课件.ppt VIP
- 2024-2025全球人才趋势报告.pdf
- 用人单位不服劳动仲裁起诉状.doc VIP
- 2024-2025学年厦门一检初三英语试卷及答案.pdf VIP
- DB33_1016-2004:先张法预应力混凝土管桩基础技术规程.pdf VIP
原创力文档


文档评论(0)