1276 发展辅导委员的考验

 描述

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

辅导员给出了一个矩阵链< A1, A2, ...,An >,他要竞选者计算这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
using namespace std;
#include
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;im)b[i][i+k]=m;
				}
			}
		}
		min=b[0][n-1];
		for(i=0;i2008)b[i][j]=b[i][j]%2008;
			}
			jieguo=b;
			jisuan=d;
		for(i=1;i2008)c[j][k]=c[j][k]%2008;
				}
				for(j=0;j2008)jisuan[j][m]=jisuan[j][m]%2008;
						}
						tl=jisuan;
						jisuan=jieguo;
						jieguo=tl;
		}
		printf("%d\n",min);
		for(i=0;i


 

你可能感兴趣的:(AC路漫漫)