动态规划-石子合并动态规划-石子合并.pptVIP

动态规划-石子合并动态规划-石子合并.ppt

  1. 1、本文档共16页,可阅读全部内容。
  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文档。上传文档
查看更多
动态规划-石子合并动态规划-石子合并

此问题的三个版本 任意版:有N堆石子,现要将石子有序的合并成一堆,每次只能移动任意的2堆石子合并,合并花费为将的一堆石子的数量。 (贪心算法,哈夫曼编码问题) 直线版:在一条直线上摆着N堆石子,其余条件不变。 圆形版:石子是排成圆形,其余条件不变。 问题初步分析 如果N-1次合并的全局最优解包含了每一次合并的子问题的最优解,那么经这样的N-1次合并后的得分总和必然是最优的。 此我们需要通过动态规划算法来求出最优解。 动态规划通项 通项式 a[i][j] = min{k | a[i][k] + a[k+1][j] + sum[i...j], k = i...j-1} (?) 其中a[i][j]表示从第i堆到第j堆合并能够取到的最小值,将其分解为两部分,从i到k,以及从k+1到j,再加上两大堆合并的得分。 部分关键代码1 int MatrixChain_min(int p[N],int n) { //定义二维数组m[i][j]来记录i到j的合并过成中最少石子数目 //此处赋值为-1 int m[N][N]; //初始化 for(int x=1;x=n;x++) for(int z=1;z=n;z++) { m[x][z]=-1; } int min=0; for(int g = 1;g=n;g++) m[g][g]=0; //主对角线 for(int i=1;i=n-1;i++) { int j=i+1; m[i][j]=p[i]+p[j]; } for(int r=3; r=n;r++) for(int i=1;i=n-r+1;i++) { int j = i+r-1; int sum=0; for(int b=i;b=j;b++) //最后一次合并的等分 sum+=p[b]; m[i][j] = m[i+1][j]+sum; //其中一种情况 //除上面一种组合情况外的其他组合情况 for(int k=i+1;kj;k++) { int t=m[i][k]+m[k+1][j]+sum; if(tm[i][j]) m[i][j] = t; } } //最终得到最优解 min=m[1][n]; return min; } 部分关键代码2 int main(){ int stone[N]; ··· min= MatrixChain_min(stone,n); max= MatrixChain_max(stone,n); //将前面简化的问题重新考虑进来,将圆转化为n个线性序列 for(int j=1;j=n-1;j++) { int min_cache=0; int max_cache=0; int cache= stone[1]; for(int k=2;k=n;k++) { stone[k-1]=stone[k]; } stone[n]=cache; min_cache= MatrixChain_min(stone,n); max_cache= MatrixChain_max(stone,n);

文档评论(0)

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

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

1亿VIP精品文档

相关文档