時限:
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; }