1048計算矩陣連乘積
1048.計算矩陣連乘積
時限: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<iostream> #include<cstdio> #include<cstring> using namespace std; int n; int a[11][2];//儲存矩陣的行數和列數 int m[11][11];//m[i][j]儲存從第i個矩陣到第j個矩陣最小乘積步數 int minx() { int minh; for(int i=1;i<=n;i++) { m[i][i]=0; } for(int i=1;i<n;i++) { m[i][i+1]=a[i][0]*a[i][1]*a[i+1][1]; } for(int i=2;i<=n-1;i++)//表示間隔大小 { for(int j=1;j<=n-i;j++)//1 3 2 4 3 5 4 6 { //計算m[j][i+j]的最小值 minh=m[j+1][i+j]+a[j][0]*a[j][1]*a[i+j][1]; for(int k=1;k<i;k++) { if(minh>m[j][j+k]+m[j+k+1][i+j]+a[j][0]*a[j+k][1]*a[i+j][1]) { minh=m[j][j+k]+m[j+k+1][i+j]+a[j][0]*a[j+k][1]*a[i+j][1]; } } m[j][i+j]=minh; } } return m[1][n]; } int main() { memset(a,0,sizeof(a)); memset(m,0,sizeof(m)); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i][0]>>a[i][1]; } cout<<minx()<<endl; return 0; }