1276 发展辅导委员的考验

 
描述

发展辅导委员是3621大班的要职。为了选拔出最佳人选,辅导员想出了一个难题来考验竞选者的毅力。

辅导员给出了一个矩阵链&lt A1, A2, ...,An &gt,他要竞选者计算这n个矩阵的乘积!!

聪明的你突然想到算法课上的最优矩阵连乘的算法。于是你决定用最优的矩阵连乘全括号方式,使得矩阵链乘积的乘法次数最少,用此方式计算矩阵链的乘积。

输入

多组输入,第一个正整数T表示组数。每组第一行有一个正整数n,1≤n≤50表示矩阵个数。第二行为p0,p1,…,pn共n+1个正整数,1≤pi≤50,pi-1×pi为矩阵Ai的大小接下来为n个矩阵。第i个矩阵有pi-1行,每行有pi个整数(在32位int范围内)。

输出

每组第一行输出矩阵链乘积乘法的最少次数,接下来输出矩阵链的乘积(将该矩阵里每个元素对2008取余后输出)。

样例输入
2
2
2 3 4
2 3 1
1 2 3
3 3 1 1
3 3 2 3
3 2 2 3
3
2 4 4 4
19 93 72 46
32 45 33 99
48 89 3 30
37 49 71 73
94 56 41 81
78 13 2 30
72 34 3 79
24 1 94 2
94 18 99 81
53 52 81 29
样例输出
24
18 17 10 14
18 15 11 16
64
591 1604 830 822
820 42 1705 121

 

 

经典的矩阵相乘问题

#include<iostream>
using namespace std;
#include<stdio.h>
void initint(int **&a)
{
	int i;
	a=new int*[51];
	for(i=0;i<51;i++)a[i]=new int[51];
}
int main()
{
	int t,n,i,j,k,m,min,a[51],**b,**c,**d;
	initint(b);
	initint(c);
	initint(d);
	int **jieguo,**jisuan,**tl;
	scanf("%d",&t);
	while(t)
	{
		scanf("%d",&n);
		for(i=0;i<=n;i++)scanf("%d",&a[i]);
		for(i=0;i<n;i++)b[i][i]=0;
		for(k=1;k<n;k++)
		{
			for(i=0;i<n-k;i++)
			{
                b[i][i+k]=b[i][i]+a[i]*a[i+1]*a[i+k+1]+b[i+1][i+k];
				for(j=i+1;j<i+k;j++)
				{
					m=b[i][j]+a[i]*a[j+1]*a[i+k+1]+b[j+1][i+k];
					if(b[i][i+k]>m)b[i][i+k]=m;
				}
			}
		}
		min=b[0][n-1];
		for(i=0;i<a[0];i++)
			for(j=0;j<a[1];j++)
			{
				scanf("%d",&b[i][j]);
				if(b[i][j]>2008)b[i][j]=b[i][j]%2008;
			}
			jieguo=b;
			jisuan=d;
		for(i=1;i<n;i++)
		{
			for(j=0;j<a[i];j++)
				for(k=0;k<a[i+1];k++)
				{
					scanf("%d",&c[j][k]);
					if(c[j][k]>2008)c[j][k]=c[j][k]%2008;
				}
				for(j=0;j<a[0];j++)
					for(m=0;m<a[i+1];m++)
						for(jisuan[j][m]=0,k=0;k<a[i];k++)
						{
							jisuan[j][m]+=jieguo[j][k]*c[k][m];
							if(jisuan[j][m]>2008)jisuan[j][m]=jisuan[j][m]%2008;
						}
						tl=jisuan;
						jisuan=jieguo;
						jieguo=tl;
		}
		printf("%d\n",min);
		for(i=0;i<a[0];i++)
		{
			for(j=0;j<a[n];j++)cout<<jieguo[i][j]<<" ";
			cout<<endl;
		}
		t--;
	}
	return 0;
}

							


			
	


 

你可能感兴趣的:(1276 发展辅导委员的考验)