- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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]是
您可能关注的文档
最近下载
- 《项目1中华优秀传统文化我知道》(教学设计)-2024-2025学年河北大学版2024小学信息技术三年级全一册.docx VIP
- 物流配送路径优化研究.docx
- 久溪威士忌酒生产项目环境影响报告.pdf
- 2025年环境影响评价工程师之环评技术方法考试题库word.docx VIP
- 文学类文本阅读之“文学短评类”试题规范解答指导.docx VIP
- HELEN新概念第二册第41课.ppt
- (一模)泰安市2025届高三一轮检测语文试卷(含标准答案).docx
- 2024年贵阳市贵安新区产业发展控股集团有限公司招聘笔试参考题库附带答案详解.pdf
- 2024年袋鼠数学竞赛Level-C (5-6年级) 真题含、解析.pdf
- 2025年PMP项目管理师考试重点难点试题集详解.docx VIP
文档评论(0)