計算矩陣連乘積

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章