- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法导论
世上本没有ACM ,AC 的人多了,也便有了!
17 动态规划
Dynamic Programming
• 和分治法一样,动态规划是通过组合子问题的解
而解决整个问题的。
• 分治法:指将问题划分成一些独立的子问题,递
归地求解各子问题,然后合并子问题的解而得到
原问题的解。
自从有了动态规划,这个世界变得好美妙!
• DP适用于子问题不是独立的情况,即各子问题
包含公共子子问题。此时,若采用分治法,会重
复地求解公共的子子问题。而DP对每个子子问
题只求解一次,将其结果保存在一张表中,从而
避免每次遇到各子问题时都要重新计算。
• DP主要用于最优化问题的求解。最优化问题一
般有很多的可行解,每个解都有一个值,目的是
找出具有最优(最大/最小)值的解。当有多个
最优解时,一般是求出一个即可。
DP的基本步骤
• ①描述最优解的结构特征;
• ②递归地定义最优解的值;
• ③按自底向上的方式计算最优解的值;
• ④由计算出的结果构造出一个最优解。
• 1-3步是用DP求解的基础。第4步,如果只要求
计算出最优解的值,可以略去。若要构造最优解
,则要在第3步中记录一些附加的信息,例如求
最短路径。
DP基础
• 采用DP方法解决最优化问题的两个要素:最优
子结构和重叠子问题。
• (1)最优子结构
• 用DP求解优化问题的第一步是描述最优解的结
构。
• 如果一个问题的一个最优解中包含了子问题的最
优解,则该问题具有最优子结构性质。
• 当一个问题具有最优子结构时,提示我们DP可
能会适用。
• 在分析问题的最优子结构性质时,所用的方法具
有普遍性:首先假设由原问题的最优解导出的子
问题的解不是最优的,然后再设法说明在此假设
下,可构造出比原问题最优解更好的解,从而导
出矛盾。
满足最优性原理的例子:最短路径
• 若路线I和J是A到C的最优路径,则根据最优化
原理,路线J必是从B到C的最优路线。这可用
反证法证明:假设有另一路径J‗是B到C的最优
路径,则A到C的路线取I和J‘ 比I和J更优,矛盾
。从而证明J必是B到C的最优路径。
• 利用问题的最优子结构性质,以自底向上
的方式递归地从子问题的最优解逐步构造
出整个问题的最优解。
• 最优子结构性质是问题能用DP求解的前
提。DP最重要的就是找到最优子结构。
• (2 )重叠子问题
• 递归算法求解问题时,每次产生的子问题并不总
是新问题,有些子问题被反复计算多次。这种性
质称为子问题的重叠性质。
• DP,对每个子问题只求解一次,然后将其解保
存在一个表格中,当再次要解此子问题时,只要
查询一下表即可。
•通常不同的子问题个数随问题的大小呈多项式增
长。因此用动态规划只需要多项式时间,从而获
得较高的解题效率。
备忘录方法
• 备忘录方法是DP的一个变种。
• 备忘录方法的控制结构与直接递归方法的控制结
构相同,区别在于备忘录方法为每个解过的子问
题建立了备忘录以备需要时查看,避免了相同子
问题的重复求解。
• 备忘录方法本质上与DP一样,但是比DP更好理
解:
• (1)使用普通的递归结构,自上而下的解决问
题。
• (2 )当在递归算法的执行中每一次遇到一个子
问题时,就计算出它的解并存入一个表中。以后
每次遇到该子问题时,只要查看并返回表中先前
填入的值即可。
• 如果所有的子问题都至少要被计算一次,则一个
自底向上的DP算法比一个自顶向下的做备忘录
算法好出一个常数因子,因为DP无需递归的代
价,而且维护表格的开销也小些;如果子问题空
间中的某些子问题根本没有必要求解,做备忘录
方法有着只解那些肯定要求解的子问题的优点。
例1:Fibonacci数列
• Fibonacci数列:
• 1,1,…,f(n-1)+f(n-2),…
• 采用树形递归方法:
int f(int n){
if(n==0 || n==1) return
文档评论(0)