区间dp.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文档。上传文档
查看更多
区间dp

最大矩阵连乘次数 描述 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最大。 输入 输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n(n≤10),表示有n个矩阵连乘,接下来一行有n+1个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开。 输出 你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最大连乘积次数。 样例输入 1 3 10 100 5 50 样例输出 75000 * 分析 一个A*B的矩阵和一个B*C的矩阵相乘所需要的乘法次数是A*B*C次,得到的矩阵是A*C的。 在运算的最后一步,总是由两部分来合成一个矩阵,因此我们只要枚举这一步,即可转到相应的子结构中去。我们定义dfs(x,y)表示第x个矩阵到第y个矩阵相乘所能够达到的最多次数。 于是我们可以知道如下方程: 其中T[x,k]*T[k+1,y]表示最后一步所需要的乘法次数。 * #include?iostream using?namespace?std; int?p[15],?q[15]; int?DFS(int?x,?int?y){ ????int?max?=?0,?temp, i; ????if(x?==?y)?return?0; ????for(i=x;?i=y-1;?i++)?{ ????????temp?=?DFS(x,?i)?+?DFS(i+1,?y)?+?p[x]*q[i]*q[y]; ????????if(temp??max)???????????max?=?temp; ????} ????return?max; } int?main(){ ????int?a,?s[15],?i,?n; ????cin??n; ????while(n--){ ????????cin??a; ????????for(i=0;?i=a;?i++) ????????????cin??s[i]; ????????for(i=1;?i=a;?i++){ ????????????p[i]?=?s[i-1]; ?q[i]?=?s[i]; ????????} ????????cout??DFS(1,?a)??endl; ????} ????return?0; } * 石子归并 描述 有n堆石子排成一条直线,每堆石子有一定的重量。现在要合并这些石子成为一堆石子,但是每次只能合并相邻的两堆。每次合并需要消耗一定的体力,该体力为所合并的两堆石子的重量之和。问最少需要多少体力才能将n堆石子合并成一堆石子? 输入 输入只包含若干组数据。每组数据第一行包含一个正整数n(2=n=100),表示有n堆石子。接下来一行包含n个正整数a1,a2,a3,...,an(0ai=100,1=i=n)。 输出 对应输入的数据,每行输出消耗的体力。 样例输入 2 47?95 样例输出 142 * 分析 我们很容易想到用贪心的想法解决,但是用贪心解题算法错误。因为不一定最小的合并在一起就可以保证最终结果是最小的。 最后合并成一对石子,是由两堆石子合并而来,不妨这样定义状态转移方程: 设F[i,j]表示从第i堆到第j堆石子数总和。 Fmin(i,j)表示将从第i堆石子合并到第j堆石子的最小的得分 * #include?iostream using?namespace?std; int?main(){ ????int?a,?q[110],?i,?j,?s[110][110],?r,?k,?p[110][110]; ????while(cin??a)??{ ????????for(i=1;?i=a;?i++) ????????????cin??q[i]; ????????memset(s,?0,?sizeof(s)); ????????for(i=1;?i=a;?i++)??{???? ????????????p[i][i]?=?q[i];?? ????????????for(j=i+1;?j=a;j++)?? ????????????????p[i][j]?=?p[i][j-1]?+?q[j];?? ????????}?? ???????????for(r=2;?r=a;?r++){ ????????????for(i=1;?i=a-r+1;?i++)??{ ????????????????j?=?i?+?r?-?1; ????????????????s[i][j]?=?INT_MAX;

文档评论(0)

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

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

1亿VIP精品文档

相关文档