- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                  动 态 规 划;本章要点:  ;动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。;适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。;如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。;找出最优解的性质,并刻划其结构特征。
递归地定义最优值。
以自底向上的方式计算出最优值。
根据计算最优值时得到的信息,构造最优解。;给定n个矩阵             ,其中  与    是可乘的,           。考察这n个矩阵的连乘积          
;(1)单个矩阵是完全加括号的;
(2)矩阵连乘积   是完全加括号的,则   可表示为2个完全加括号的矩阵连乘积   和   的乘积并加括号,即    ;例子:设有四个矩阵            ,它们的维数分别是:
;问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。;方法二:动态规划;(1) 分析最优解的结构;设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]         
当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n
当ij时,
可以递归地定义m[i,j]为:
;对于1≤i≤j≤n,不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数最多只有
因此在递归计算时,许多子问题被重复计算多次。这是该问题可用动态规划算法求解的又一显著特征。;用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。;A1;一、最优子结构;一、最优子结构 (       );同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低)。;二、重叠子问题;通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。 ;三、动态规划算法的变形——备忘录方法;int LookupChain(int i,int j)
{
       if (m[i][j]  0) return m[i][j];
       if (i == j) return 0;
       int 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++) {
         int 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;
};3.4 范例一:最长公共子序列;给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。 ;设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk},则
(1)若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列。
(2)若xm≠yn且zk≠xm,则Z是Xm-1和Y的最长公共子序列。
(3)若xm≠yn且zk≠yn,则Z是X和Yn-1的最长公共子序列。;;void LCSLength(int m,int n,char *x,char *y,int **c,int **b)
{      int i,j;
       for (i = 1; i = m; i++) c[i][0] = 0;
       for (i = 1; i = n; i++) c[0][i] = 0;
       for (i = 1; i = m; i++)
          for (j = 1; j = n; j++) 
          {  if (x[i]==y[j]) 
                    { c[i][j]=c[i-1][j-1]+1;   b[i][j]=1; }
             else 
                
原创力文档
                        

文档评论(0)