ACM动态规划算法C语言.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文档。上传文档
查看更多
动态规划算法 动态规划算法的特点: 动态归化算法是将问题分解成若干个子问题,通过求解这些子问题的最优解来求整个问题的最优解。与分治法不同的是,这些子问题往往并不相互独立,不能将子问题的解作为最后问题的解。动态规划往往用于求解问题的最优解。 例1:给定n个矩阵的连乘表达式,求其最少需要多少次乘法运算才能计算出乘法运算的结果。 分析: 设m[i][j]表示计算出Ai Ai+1…Aj所需要的最少次乘法运算。而假设要得出这样的最优解需要从第k个位置断开,这样就将其分解成两个部分,前一部分的最优计算次数为m[i][k], 后一部分的最优次序为m[k+1][j],显然有下面的表 达式存在: m[i][j]=0; i=j 因为在i=j时表示只有一个矩阵,没有进行乘法运算,其乘法运算的次数为0。 m[i][j]=m[i][k]+m[k+1][j]+pi-1pkpj 其中i=kj 由于k的位置是未知的,因此需要求其最小值: m[i][j]=min(m[i][k]+m[k+1][j]+pi-1pkpj) 其中i=kj 只要计算出所有可能的组合中的最小值就可以计算出m[i][j]的值。 比如计算A0[10][100]*A1[100][50]*A2[50][2]的最小乘法次数,可采用如下的计算步骤获得: m[0][2]=min(m[0][0]+m[1,2]+10*100*2,m[0][1]+m[2][2] +10*50*2)=min(100*50*2+10*100*2, 10*100*50+10*50*2) =12,000 对于算A0[10][100]*A1[100][50]*A2[50][2]*A4[2][10]的最小乘法次数,可采用如下的计算步骤获得: m[0][4]=min(m[0][0]+m[1][3]+10*100*10,m[0][1]+m[2][3] +10*50*10, m[0][2]+m[3][3]+10*2*10)=12200; k=2; 其中:m[0][0]=m[3][3]=m[1][1]=m[2][2]=0; m[2][3]=50*2*10=1000; m[1][2]=2*100*50=10000; m[0][1]=10*100*50=50000; m[1][3]=min(m[1][1]+m[2][3]+100*50*10, m[1][2]+ m[3][3]+100*2*10)=12000; 此时k=2; m[0][2]=min(m[0][0]+m[1][2]+10*100*2, m[0][1]+ m[2][2]+10*50*2)=12000; 此时k=0; 从上面的计算过程可以看出,如果先计算出m[1][2]就可计算出m[0][2], 先计算出m[2][3]就可计算出m[1][3], 因此可 采用自底向上的计算方法进行计算。如上例中,可采用如下的计算顺序: m[0][0]-m[1][1]-m[2][2]-m[3][3] m[0][1]-m[1][2]-m[2][3] m[0][2]-m[1][3] m[0][3] 从上面的计算顺序可以看出类似于一个上三角矩阵,先计算斜线上的元素,并依次向上递推。 如果希望知道采用何种方式才能实现乘法次数最少,可用一个数组s[i][j]来记录m[i][j]最优解时的k值。每一个m[i][j]对应一个s[i][j],这样就可知道如何分解上述矩阵表达式以得到最小的乘法次数了。上例中k值依次为0-2 在上例中,最后的分解结果为(A0[10][100]*(A1[100][50]* A2[50][2]))*A4[2][10]。 从上面的求解过程来看,动态规划问题取决于两个重要的性质: 1、最优子结构性质:问题的最优解包含了其子问题的最优解。 2、子问题重叠性质:后续问题的求解可通过前面的子问题的求解结果计算出来。 因此可通过动态规划基本上可通过递归算法实现。 例2:设序列X={x1,x2,x3…,xm}, Y={y1,y2,y3,…,yn}, 求这两个序列的最长公共子序列Z。 设Z={z1,z2,z3,…zk}, 则必有下面的结论存在:   (1)如果xm=yn,说明xm或yn一定是最长公共子序列中的最后一个元素,即zk=xm=yn。同样可以得出{z1,z2,z3,…,

文档评论(0)

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

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

1亿VIP精品文档

相关文档