第三章动态规划法_new.pptVIP

  1. 1、本文档共73页,可阅读全部内容。
  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文档。上传文档
查看更多
第三章动态规划法_new

算法设计与分析 * 动态规划法总结 与分治法相比,相同之处是也将原问题分解为若干子问题,再递归求解;不同之处是所分解的子问题彼此并不独立,而是互有重叠。 基本思想是造表记录已解的子问题,再次遇到时仅查表即可,避免了重复计算,提高效率。 通常用于求解具有最优性质的问题,而且其子问题也具有最优性质(最优子结构性质)。 实现方法通常为自底向上的递归形式,但也可以采用自上而下的形式(备忘录方法)。 算法设计与分析 * 多阶段图最短路问题 下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A-E。求A-E的最省费用。 A B1 B2 C1 C2 C3 C4 D1 D2 D3 E 2 5 8 3 6 11 2 3 1 5 4 2 7 5 3 8 算法设计与分析 * 多阶段图最短路问题(2) 直观的方法是用回溯法搜索。时间复杂度为指数级。 低效的原因:没有充分利用重叠子问题的性质。 算法设计与分析 * 多阶段图最短路问题(3) 此图有明显的次序,可以划分为5阶段。故此问题的要求是:在各个阶段选取一个恰当的决策,使由这些决策组成的一个决策序列所决定的一条路线,其总路程最短。 由目标状态E向前推,可以分成四个阶段,即四个子问题。每个阶段到E的最省费用为本阶段的决策路径。 A B1 B2 C1 C2 C3 C4 D1 D2 D3 E 阶段0 阶段1 阶段2 阶段3 阶段4 算法设计与分析 * 多阶段图最短路问题(4) 设 Dis[k][x] 为第k阶段城市x到城市E的最短路径长度。 map[ i ][ j ]为i,j两个城市间的距离。 递归方程为 Dis[k][x] = min { Dis[k+1][y]+map[x,y] } 此问题时间复杂度降为O(n2). 算法设计与分析 * 动态规划的概念 在上例的多阶段决策问题中,各个阶段采取的决策,依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化问题的方法为动态规划方法。 算法设计与分析 * POJ 1163 数字三角形 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100 数字为0 - 99 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 算法设计与分析 * 输入格式: //三角形行数。下面是三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 要求输出最大和 算法设计与分析 * 算法一:递归的想法 设f(i,j) 为三角形上从点(i,j)出发向下走的最长路经,x为点(i,j)的数值,则 f(i,j) = x+max(f(i+1,j), f(i+1,j+1)) 要输出的就是f(0,0)即从最上面一点出发的最长路经。 代码如下: 算法设计与分析 * #include iostream.h #define MAX 101 int triangle[MAX][MAX]; int n; int longestPath(int i, int j); void main(){  int i,j;  cin n;  for(i=0;in;i++) for(j=0;j=i;j++)   cin triangle[i][j];  cout longestPath(0,0) endl; } int longestPath(int i, int j){  if(i==n) return 0;  int x = longestPath(i+1,j);  int y = longestPath(i+1,j+1); if(xy) x=y; return x+triangle[i][j]; }             超时 算法设计与分析 * 算法二:动态规划从下往上逐层计算 #include iostream.h #define MAX 101 int triangle[MAX][MAX], n; void main(){  int i,j;  cin n;  for(i=0;in;i++)   for(j=0;j=i;j++)    cin triangle[i][j];  for(i=n-2;i=0;i--)   for(j=0;j=i;j++){    int x=triangle[i+1][j];   

文档评论(0)

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

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

1亿VIP精品文档

相关文档