第二十讲动态规划.PDF

  1. 1、本文档共57页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二十讲动态规划

程序设计实习程序设计实习(II):(II): 算法设计算法设计 第二十讲动态规划 上一节课回顾 影响搜索效率的因素 搜索对象(枚举什么) 搜索顺序搜索顺序((先枚举什么先枚举什么,后枚举什么后枚举什么)) BFS :广度优先 DFS :深度优先先 A* :估价函数最小优先 剪枝(及早判断出不符合要求的情况) 3 3 问题提出:为什么要用动态规划 BFS和DFS :树形递归存在冗余计算 例1:POJ 2753 Fibibonaccii数列数列 求求FibonacciFibonacci数列的第数列的第nn项项 int f(int n) { if(n==0 || n==1) return n; return f(f(n-1)1)+f(f(n-2)2); } } 4 树形递归存在冗余计算 为了除去冗余,需要从已知条件开始计算,并记 录计算过程中的中间结果录计算过程中的中间结果 f(5)f(5) f(4) f(3) f(3) f(2) f(2) f(1) f(2) f(1) f(1) f(0) f(1) f(0) 1 f(1) f(0) 1 1 0 1 0 1 0 冗余计算! 5 树形递归存在冗余计算 去除冗余: intint f[n+1];f[n+1]; f[1]=f[2]=1; int i; for((i=3;;i=n;;i++)) f[i] = f[i-1]+f[i-2]; cout f[f[n]] endldl; 用空间换时间动态规划 用空间换时间动态规划 6 什么是动态规划? 动态规划是求解包含重叠子问题的最优化方法 基本思想: 将原问题分解为相似的子问题 在在求解的过程中求解的过程中通过通过保存子保存子问题的解问题的解求出原问题的解求出原问题的解 (注意:不是简单分而治之) 只能应用于有最优子结构的问题(即局部最优解能决 定全局最最优解解,,或问题能分解解成子问题来来求解解) 动态规划=记忆化搜索 7 动态规划是如何工作的 例2 POJ 1163 数字数字三角角形 7 3 8 8 1 0 22 77 44 44 4 5 2 6 5  在上面的数字在上面的数字三角形中寻找角形中寻找一条从顶部到底边的路径条从顶部到底边的路径, 使得路径上所经过的数字之和最大  路径上的每路径上的每一步都只能往左下或右下走步都只能往左下或右下走。只需要求出这只需要求出这 个最大和即可,不必给出

您可能关注的文档

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档