計算矩陣連乘積
阿新 • • 發佈:2018-12-17
時限: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> #define MAXSIZE 105 using namespace std; int A[MAXSIZE]; int mul[MAXSIZE][MAXSIZE]; int loc[MAXSIZE][MAXSIZE]; int main() { int n,t,i,r,k,j; cin >> n; memset(mul,0,sizeof(mul)); for(i=0;i<n;i++) { cin >> A[i]; cin >> t; } A[n] = t; for(r= 1;r<n;r++) { for(i =1;i<n;i++) { j = i + r; mul[i][j] = mul[i+1][j]+A[i-1]*A[i]*A[j]; loc[i][j] = i; for(k = i + 1; k < j; k++) { t = mul[i][k]+mul[k + 1][j] + A[i - 1]*A[k]*A[j]; if(t < mul[i][j]) { mul[i][j] = t; loc[i][j] = k; } } } } cout << mul[1][n] << endl; return 0; }