题目大意:
给n个矩阵的行和列,问怎么安排相乘的顺序才能使得乘的次数最少。
解题思路:
动态规划问题。
设计算矩阵A[i:j],1<=i<=j<=n,所需要的最少乘法次数为m[i,j],则原问题的最优值为m[1,n]。
当i=j时,A[i:j]=Ai,m[i,i]=0,i=1,2,…,n;
当i
代码如下:
#include<stdio.h>
void MatrixChain(int n,int p[],int m[][11],int s[][11]){
int i,j,k,r,t;
for(i=1;i<=n;i++) m[i][i]=0;
for(r=2;r<=n;r++)
for(i=1;i<=n-r+1;i++){
j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(k=i+1;k<j;k++){
t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j]){
m[i][j]=t;
s[i][j]=k;
}
}
}
}
void output(int i,int j,int s[][11]){
if(i==j)
printf("A%d",i);
else{
printf("(");
output(i,s[i][j],s);
printf(" x ");
output(s[i][j]+1,j,s);
printf(")");
}
}
int main(){
int i,n,ca=1,p[11],m[11][11],s[11][11];
while(scanf("%d",&n),n){
for(i=1;i<=n;i++) scanf("%d %d",&p[i-1],&p[i]);
MatrixChain(n,p,m,s);
printf("Case %d: ",ca++);
output(1,n,s);
printf("\n");
}
return 0;
}
6340

被折叠的 条评论
为什么被折叠?



