时限:
1000ms 内存限制:10000K 总时限:3000ms
描述:
在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。计算C=AB总共需要p×q×r次乘法。 现在的问题是,给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。 要求计算出这n个矩阵的连乘积A1A2…An最少需要多少次乘法。
输入:
输入数据的第一行是一个整数n(0 < n <= 10),表示矩阵的个数。 接下来的n行每行两个整数p,q( 0 < p,q < 100),分别表示一个矩阵的行数和列数。
输出:
输出一个整数:计算连乘积最少需要乘法的次数。
输入样例:
10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
输出样例:
438
#include<stdio.h> int n;//矩阵个数(0~10) int p[11];//矩阵维数(n+1) void Matrix_mult() { int Arr[11][11],temp;//(a[0][0]不用)a[i][j]存放从矩阵i到矩阵j的最小矩阵乘法数 int i,j,k; int d;//矩阵间隔d for(i=1;i<=n;i++) Arr[i][i]=0;//第i个矩阵到第i个矩阵乘法数为1 for(d=1;d<=n-1;d++)//矩阵间隔r//矩阵链长度d+1 { for(i=1;i<=n-d;i++)//i=1..~n-d { j=i+d;//i~i+d构成长度为r+1的矩阵链 Arr[i][j]=0+Arr[i+1][j]+p[i-1]*p[i]*p[j];//截断位置为i for(k=i+1;k<j;k++)//截断位置为k=i+1,i+2.....j-1 { temp=Arr[i][k]+Arr[k+1][j]+p[i-1]*p[k]*p[j]; if(temp<Arr[i][j]) Arr[i][j]=temp;//获得从矩阵i到矩阵j的最小矩阵乘法数 } } } printf("%d\n",Arr[1][n]);//从第1个矩阵到第n个矩阵最小乘法数 } int main() { int i; scanf("%d",&n);//矩阵个数(0~10) int b[10][2]; for( i=0;i<n;i++) { scanf("%d",&b[i][0]);//第i个矩阵的行数 scanf("%d",&b[i][1]);//第i个矩阵的列数 } for(i=0;i<n;i++) p[i]=b[i][0];//存放所有矩阵维数(测例中的1,2,3...10,11) p[n]=b[n-1][1]; Matrix_mult(); return 0; }