动态规划----矩阵连乘问题.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划----矩阵连乘问题 动态规划法是解决问题的一种方法。它不规定为了得到结果需如何将问题划分为子问题的固定方法,而是按不同输入给出问题的具体实例的子问题划分方法,然后再进行运算、解答问题。 矩阵连乘问题的主要思想如下: 1)设置大小为连乘个数的方阵 2)主对角线上方各元素Di,j(ij)表示矩阵Mi连乘到Mj的最小工作量 3)下方元素Di,j(ij)记录获得该最小工作量矩阵分组的第一组的最后一个矩阵的序列号 最后通过下方元素可知最终结果的分组方式。 算法描述为: 1)读入n, 即矩阵的个数; 2)读入n+1个数, 即n个矩阵的行数和列数, 将它们存入数组r中; 3)将d主对角线元素置为零; 4)求出d矩阵的其它元素的数值; 5)给出n个矩阵的结合方式. 程序源代码: #define MAXINT 1000 int D[10][10],R[11]; void print(int i, int j) { int k; if(i==j) printf(M%d,i); else if (i+1==j) printf(M%d,M%d,i,j); else { k =D[j][i]; printf( (); print(i,k); print(k+1, j); printf()); } } DM(int N) { int I,J,K,T; for(I=1;IN-1;I++) for(J=1;JN-1;J++) { D[J][J+1]=MAXINT; for(K=0;KI-1;K++) { T=D[J][J+K]+D[J+K+1][J+1]+R[J-1]*R[J+K]*R[J+1]; if(TD[J][J+1]) { D[J][J+1]=T; D[J][J+1]=J+K; } } } } main() { int flag=1,N,i; char c; printf(e------exit i--------continue\n); while(flag==1) {scanf(%c,c); switch(c) { case i: flag=1; printf(Please Input The Data:\n); printf(The value of matrix: N=); scanf(%d,N); for(i=0;iN;i++) { printf(R[i]=,i); scanf(%d,R[i]); } for(i=1;iN;i++) D[i][i]=0; DM(N); print(1,N+1); break; case e: flag=0;break; } } } 运行结果: 动态规划----有向图的最短路径问题 include iostream.h int const m=4; struct node { int flag[m]; float cost; }; void all_paths(node COST[m][m],node A[m][m],int n) { int i,j,k; for(i=0;in;i++) for(j=0;jn;j++) { A[i][j].cost=COST[i][j].cost; for(k=0;kn;k++) A[i][j].flag[k]=0; } for(k=0;kn;k++) { for(i=0;in;i++) for(j=0;jn;j++) { if(A[i][j].cost(A[i][k].cost+A[k][j].cost))

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档