1. 程式人生 > >1048計算矩陣連乘積

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; }