网站大量收购独家精品文档,联系QQ:2885784924

实验:矩阵相乘最小代价顺序.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验:矩阵相乘最小代价顺序

实验:矩阵相乘最小代价顺序 实验描述: 多个矩阵相乘按照不同的结合相乘得到的相乘次数会有不同,求出一种顺序使得最后完成多个矩阵相乘相乘次数最少的相乘办法,把相乘的次数输出,相乘的顺序输出。输入时按顺序输入各个相乘矩阵的维数,如M1(10*20) * M2(20*50) * M3(50*1) *M4(1*100) 可表示为10 20 50 1 100。 实验思路: 本题可用典型的动态规划思想解决,用m[i][j]表示矩阵M[i] *M[i+1] *……*M[j]的最小代价。 那么i==j时,m[i][j]=0即不用相乘, j!=i时,m[i][j]=MIN(m[i][k]+m[k+1][j]+r[i]r[k+1]r[j+1]),其中i=kj;r[]数组中储存着输入时对应的维数,如实验描述中r[1]=10//代表第一个矩阵的行数;r[2]=20//代表第二个矩阵的行数……..r[5]=100//代表最后一个矩阵的列数。 以上思路即可解决最小相乘次数的求出。 还需求出相乘的顺序,以如下的形式表示出来: (A1*(A2*A3))*A4 按照这种形式输出,那么只需建立一个数组a[],大小比矩阵个数大一,分别对应Ai的”(“或”)”的个数。 用s[i][j]表示Mi到Mj矩阵相乘的断点。 实验复杂度分析: 程序中需要三重循环,计算次数:0+(0+1)+(0+1+2)+(0+1+2+3)+(0+1+2+3+4)+…..+(0+1+2+…+N)=N+(N-1)*2+(N-2)*3+….+N约为N(3) 因为申请了两个N*N 的数组空间,空间复杂度:N(2). 实验代码: #includestdio.h #includemath.h #includestring.h #define MAX 100 const int t=0; int N; int a[MAX]; int p[MAX]; int m[MAX][MAX]; int s[MAX][MAX]; void stop(int m,int n) { int k; if(n==m+1||n==m){/*a[t++]=n;*/return;} k=s[m][n];//printf(%d\n,k); if(k!=m){a[k]--;a[m]++;} if(k+1!=n){a[k+1]++;a[n]--;} stop(m,k); stop(k+1,n); } void main() { int i,j,k,min,temp; printf(请输入总矩阵的个数:\n); scanf(%d,N); printf(请输入每个矩阵的维数:\n); for(i=1;i=N+1;i++) scanf(%d,p[i]); memset(a,0,sizeof(a)); for(j=1;j=N;j++) for(i=j;i0;i--){ if(i==j){m[i][j]=0;s[i][j]=i;} else{ min=32767; for(k=i;kj;k++){ temp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]; if(tempmin){min=temp;s[i][j]=k;} } m[i][j]=min; } } printf(代价:%d次\n顺序为:,m[1][N]); stop(1,N); for(i=1;i=N;i++){ if(a[i]=0){ for(j=1;j=a[i];j++) printf((); if(i==N) printf(A%d,i); else printf(A%d*,i); } else { printf(A%d,i); for(j=1;j=fabs(a[i]);j++) printf()); if(i!=N)printf(*); } } printf(\n); } 实验结果: 求两个字符串的最大的公共子序列 实验描述: 给出两个字符串,如asdfg ,和 axdcfg ,那么他们的公共子序列为adfg,长度为4 即找出两个字符串中相同的未打乱顺序的最长子序列。 实验思路: 本题可以用动态规划的思想解决。 用len[i][j]表示第一个字符串的前i个字符与第二个字符串前j个字符的最大公共序列长度。 当a[i]=b[j]时,len[i][j]=len[i-1][j-1]+1; 当a[i]!=b[j]时,len[i][j]=MAX(len[i][j-1],len[i-1][j]); 用father[i][j]表示len[i][j]是

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档