第9章-动态规划与贪心策略.pptxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第九章 动态规划与贪心策略动态规划策略通常用于求解具有某种最优性质的问题。贪心算法则是仅在当前状态下做出的最好选择,即局部最优选择;然后再求解做出该选择后所产生的相应子问题的解。动态规划思想动态规划策略的应用贪心策略的基本要贪心策略的应用动态规划适用于动态规划法求解的问题,经分解得到的子问题往往不是互相独立的; 基于动态规划法的算法设计通常按以下几个步骤进行: (1) 找出最优解的性质,并描述其结构特征; (2) 递归定义最优值; (3) 以自底向上的方式计算最优值; (4) 根据计算最优值时得到的信息构造一个最优解。 通常在步骤(3)计算最优值时,需要记录更多的信息,以便在步骤(4)中快速构造出一个最优解。动态规划算法的基本要素动态规划算法的两个基本要素——最优子结构性质和子问题重叠性质。 (1) 最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 (2) 重叠子问题:对每个子问题只解一次,然后将解保存在一个表格中,当再次需要解此问题时,只是简单地用常数时间查看所保存的结果即可。 计算A[1:4]的递归树 备忘录方法是动态规划算法的一个变形。备忘录方法的递归方式是自顶向下,动态规划算法则是自底向上。具体算法思想: 每一个子问题建立一个记录项,初始化时将其赋值为特定值,表示该子问题尚未求解。在求解过程中,对每个待求解的子问题首先查看其相应的记录项,若记录项中存储的值是初始化的值,则表示该子问题第一次遇到,就需要计算该子问题的解,并存入相应的记录项,否则表示该子问题已经求解,即不必再计算该子问题。 备忘录算法int MemorizedMatrixChain ( int n, int m[][n], int s[][n] ) { for ( int i = 1; i = n; i++) for ( int j = 1; j = n; j++) m[i][j] = 0; return LookupChain (1, n );}int LookupChain ( int i, int j ) { int u,t; if ( m[i][j] 0 ) return m[i][j]; if ( i == j ) return 0; u=LookupChain(i, i)+LookupChain(i+1, j)+p[i-1]*p[i]*p[j]; s[i][j] = i; for ( int k = i+1; k j; k++) { t=LookupChain(i, k)+LookupChain(k+1, j)+p[i-1]*p[k]*p[j]; if ( t u ) { u = t; s[i][j] = k; } } m[i][j] = u; return u;}备忘录算法分析在调用LookupChain时,如果m[i][j]0,那么m[i][j]中存储的值就是待求的值,直接返回此结果即可;否则通过递归算法自顶向下计算,并将计算结果存入m[i][j]后返回。与动态规划算法一样,备忘录算法的复杂性是O(n3)。 当一个问题的所有子问题都至少需要求解一次时,则动态规划算法好于备忘录方法;当子问题空间中的部分子问题可以不必求解时,备忘录算法优于动态规划算法。矩阵连乘积的最优计算次序问题可用自顶向下的备忘录算法或自底向上的动态规划算法在O(n3)计算时间内求解。这两个算法都利用了子问题重叠性质。 矩阵连乘问题问题:给定n个矩阵{A1, A2 , …, An},其中Ai和Ai+1是可乘的,i = 1, 2, …,n-1,要求计算这n个矩阵的连乘积A1A2…An。解题思路:矩阵乘法满足结合律,如果矩阵连乘完全加了括号,则说明计算矩阵连乘的次序也完全确定。完全加括号的矩阵连乘积可以递归定义为: (1) 单个矩阵是完全加括号的; (2) 矩阵连乘积A是完全加括号的,则A可以表示为两个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。每一种完全加括号的方式对应于一种矩阵连乘积的计算次序,而这种计算次序与计算矩阵连乘积的计算量有着密切的关系。 矩阵连乘问题示例【例1】三个矩阵{ A1, A2, A3},其连乘积A1A2A3有2种计算次序:A1(A2A3)和(A1A2)A3,矩阵维数分别是10/100、100/5和5/50。分析:若按第一种括号方式计算,则计算三个矩阵连乘积需要的数乘次数为:100*5*50+10*100*50=75,000。若按第二种括号方式计算,则计算三个矩阵连乘积需要的数乘次数为:10*100*5+10*5*50=7,500。对于n个矩阵如何确定矩阵连乘积的最优计算次序?穷举法不是一个有效的算法建立递归关系设计算A[i:j](1≤i≤j≤n)所需的最少数乘次数为

文档评论(0)

你找对了 + 关注
实名认证
文档贡献者

正版课件均可编辑 注意:其它人很多盗版P P T都是图片形式,买到请直接投诉退款!

1亿VIP精品文档

相关文档