015动态规划 - 1 动态规划要点.pptVIP

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
山东大学计算机科学与技术学院 数据结构 第13章 贪婪算法 * 第14章 动态规划算法 (Dynamic Programming) 山东大学计算机科学与技术学院 数据结构 第13章 贪婪算法 * 本章内容 动态规划方法 应用 * * 五种算法设计方法中难度最大的一种,它建立在最优原则的基础上。 采用动态规划方法,可以优雅而高效地解决许多用贪婪算法或分而治之算法无法解决的问题。 * * 和贪婪算法一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。 不同的是,在贪婪算法中,每采用一次贪婪准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。 动态规划 * * 动态规划方法采用最优原则( principle of optimality)来建立用于计算最优解的递归式。 所谓最优原则即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次决策产生)的最优决策。 动态规划 * * 动态规划法 在求解某些问题的时候,可以试着把问题分成必要多的子问题,每个子问题又可以分成数目不确定的必要多的子子问题,这样就会产生大量的子问题。如果分得的子问题界限不清,互相交叉,则在大量的子问题中会存在一些完全相同的子问题。 为了避免界重复解这些相同的子问题,可以在解决一个子问题后把它的解保留下来,若遇到求解与之相同的子问题的时候,就可以把它找出来直接使用。 为解问题而将它的子问题的解填入表中以待需要时查表,这样的方法就是动态规划法。 * * * * 假设G为有向图,其中每条边都有一个长度(或耗费),图中每条有向路径的长度等于该路径中各边的长度之和。对于每对顶点(i, j),在顶点i 与j 之间可能有多条路径,各路径的长度可能各不相同。 定义从i 到j 的所有路径中,具有最小长度的路径为从i 到j 的最短路径。 最短路径 * * 例 顶点1到顶点3的路径 * * 在所有点对最短路径问题(all-pairsshorest-pathsproblem)中,要寻找有向图G中每对顶点之间的最短路径。 也就是说,对于每对顶点(i,j),需要寻找从i到j的最短路径及从j到i的最短路径。 因此对于一个n个顶点的图来说,需寻找p=n(n-1)条最短路径。 假定图G中不含有长度为负数的环路。 所有点对最短路径问题 * * 设图G中n个顶点的编号为1到n。令c(i,j,k)表示从i到j的最短路径的长度,其中k表示该路径中的最大顶点。 因此,如果G中包含边i,j,则c(i,j,0)=边i,j的长度;若i=j,则c(i,j,0)=0;如果G中不包含边i,j,则c(i,j,0)=+∞。c(i,j,n)则是从i到j的最短路径的长度。 最短路径 * * 例 若k=0,1,2,3,则c(1,3,k)=∞;c(1,3,4)=28;若k=5,6,7,则c(1,3,k)=10;若k=8,9,10,则c(1,3,k)=9。因此1到3的最短路径长度为9。 * * 对于任意k>0,如何确定c(i,j,k)呢? 中间顶点不超过k的i到j的最短路径有两种可能:该路径含或不含中间顶点k。若不含,则该路径长度应为c(i,j,k-1),否则长度为c(i,k,k-1)+c(k,j,k-1)。c(i,j,k)可取两者中的最小值。因此可得到如下递归式: c(i,j,k)=min{c(i,j,k-1), c(i,k,k-1)+c(k,j,k-1)},k>0 最短路径 * * 递归方法 迭代? 复杂性 * * //寻找最短路径的长度 //初始化c(i,j,1) for(int i=1;i=n;i++) for(int j=1;j=n;j++) c(i,j,0)=a(i,j);//a是长度邻接矩阵 //计算c(i,j,k)(0k=n) for(int k=1;k=n;k++) for(int i=1;i=n;i++) for(intj=1;j=n;j++) if(c(i,k,k-1)+c(k,j,k-1)c(i,j,k-1)) c(i,j,k)=c(i,k,k-1)+c(k,j,k-1); else c(i,j,k)=c(i,j,k-1); 最短路径算法伪代码 * * templateclass T void AdjacencyWDigraphT::Allpairs(T **c, int **kay) { / /所有点对的最短路径 / /对于所有i和j,计算c[i][j]和kay[i][j] / /初始化c[i][j]=c(i,j,0) for (int i = 1; i = n; i++

文档评论(0)

boss + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档