第3章动态规划.pptVIP

  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文档。上传文档
查看更多
第3章动态规划

算法设计与分析 第三章 动态规划 杨圣洪 分治法的基本思想 分治法的基本思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 动态规划基本步骤 找出最优解的性质,并刻划其结构特征。判断整体最优是否有局部最优 递归定义最优值。有难度。 以自底向上的方式计算出最优值。非递归 根据计算最优值时得到的信息,构造最优解。! 3.5 凸多边形最优三角剖分 用多边形顶点的逆时针序列表示凸多边形,即P={v0,v1,…,vn-1}表示凸多边形。如:{V0,V6,V5,V4,V3,V2,V1} 若vi与vj不相邻则线段vivj称为多边形的一条弦,如(V1,V3)。弦将多边形分割成2个多边形{vi,vi+1,…,vj}和{vj,vj+1,…vi}。如{v1,v2,v3},{v3,v4,…,v1} 三角剖分=互不相交的三角形的 集合T。 给定凸多边形P以及定义在三角形上的权函数w。寻找三角形上权之和为最小的三角剖分。 弦不同则划分不同,即不同点间连线不同则划分不同 下图为二个不同的剖分。 三角剖分的结构及其相关问题 一个表达式的完全加括号方式可用完全二叉树描述,表达式的语法树。 例如,((A1(A2A3))(A4(A5A6)))运算次序所相应的语法树如图 (a)所示。 凸多边形{v0,v1,…vn-1}的三角剖分也可以用语法树表示 例如,图 (b)中凸多边形的三角剖分可用图 (a)所示的 语法树 表示。 矩阵连乘积中的每个矩阵Ai?凸(n+1)边形中的一条边vi-1vi。 三角剖分中的一条弦vivj,ij ?矩阵连乘积A[i+1:j]。 最优子结构性质 凸多边形最优三角剖分问题是最优子结构。(以下板) 若凸(n+1)边形P={v0,v1,…,vn-1 ,vn}的最优三角剖分T包含三角形v0vkvn,如v0v3v6 T分为:?v0vkvn,子多边形{v0, v1, …,vk}和{vk,vk+1,…,vn} 。如{v0v1v2v3}, {v3v4v5v6} 这2个子多边形的三角剖分也是最优的。 若{v0,v1,…,vk}或{vk,vk+1,…,vn}不是最优,即还有更小权的三角剖分,将导致T不是最优三角剖分的矛盾。 最优三角剖分的递归结构 用t[i][j](1≤ij≤n)表凸子多边形{vi-1,vi,…,vj}的最优三角剖分权函数值,约定t[i][i]= 0即退化多边形{vi-1,vi}权值为0 t[1][n]为凸(n+1)边形P的最优权值,各三角形的边长和。 利用最优子结构递归地计算t[i][j]。 当j-i?1时,凸子多边形至少有3个顶点(i-1,i,j)。 t[i][j]=子多边t[i][k]+子多边t[k+1][j]+三角形vi-1vkvj i≤k≤j-1,k有j-i个值,在其中选出使t[i][j]达到最小的k 最优三角剖分的递归结构 算法描述 矩阵连乘的算法 void MatrixChain(int *p,int n,int **m,int **s){ for(int i=1;i=n;i++){ for(int j=1;j=n;j++) {m[i][j] = 0; }}  for (int r = 2; r = n; r++) //两两相乘到n个相乘   for (int i = 1; i = n - r+1; i++) { //起点i    int j=i+r-1; //终点j //m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];s[i][j]=i;//初值    for (int k =i; k j; k++) { //断点k=i+1~j-1  int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];      if (t m[i][j]) { m[i][j] = t; s[i][j] = k;}    }   } } 计算最优值 void MinWT(int n, type **t, int **s) { //此处n=点数-1,因为v0,v1,…,vn for (int i=1;i=n;i++) t[i][i]=0; //对应m[i][i]=0 for (int r=2; r=n; r++) //区间

文档评论(0)

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

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

1亿VIP精品文档

相关文档