给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
Input
有N个矩阵连乘,用一行有n+1个数数组表示,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开.
Output
你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数,输出最优全括号结构
Sample Input
10 100 5 50
Sample Output
7500
((A1A2)A3)
#include<stdlib.h>
#include<stdio.h>
#include <memory.h>
#define N 3
int s[N+1][N+1]; //s[i][j]中记录了对Ai...Aj进行分裂的最优的k值
void Print_OPTIMAL_PARENS(int i,int j) //定义函数打印最优全括号的结果
{
if(i==j)
printf("A%d",i);
else
{
printf("(");
Print_OPTIMAL_PARENS(i,s[i][j]); //在分裂处进行递归调用
Print_OPTIMAL_PARENS(s[i][j]+1,j);
printf(")");
}
}
int main()
{
int matrix[N+1]; //matrix中记录矩阵的维数
int i,j,k,q;
int m[N+1][N+1]; //m中记录矩阵连乘的次数
for(i=0;i<=N;i++)
scanf("%d",&matrix[i]);
memset(m,0,(N+1)*(N+1)*sizeof(int));
for(j=1;j<=N;j++)
for (i=j;i>=1;i--) //当i=j时,m[i][j]=0,
{ //当i<j时,m[i][j]=min{m[i][k]+m[k+1][j]+p(i-1)p(k)p(j)} i=<k<j
if (j==i)
m[i][j]=0;
else
{
m[i][j]=600000;
for (k=i;k<j;k++)
{
q=m[i][k]+m[k+1][j]+matrix[i-1]*matrix[k]*matrix[j];
if (q<m[i][j])
{
m[i][j]=q;
s[i][j]=k;
}
}
}
}
printf("%d\n",m[1][N]);
Print_OPTIMAL_PARENS(1,N);
return 0;
}