442 - Matrix Chain Multiplication

来源:互联网 发布:烟台网络党校 编辑:程序博客网 时间:2024/03/29 06:17

Suppose you haveto evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices.Since matrix multiplication is associative, the order in which multiplicationsare performed is arbitrary. However, the number of elementary multiplicationsneeded strongly depends on the evaluation order you choose.

For example, let Abe a 50*10 matrix, B a 10*20 matrix and C a 20*5 matrix. There are twodifferent strategies to compute A*B*C, namely (A*B)*C and A*(B*C).

The first onetakes 15000 elementary multiplications, but the second one only 3500.

Your job is towrite a program that determines the number of elementary multiplications neededfor a given evaluation strategy.

Input Specification

Input consists oftwo parts: a list of matrices and a list of expressions.

The first line ofthe input file contains one integer n (  ), representingthe number of matrices in the first part. The next n lineseach contain one capital letter, specifying the name of the matrix, and twointegers, specifying the number of rows and columns of the matrix.

The second part ofthe input file strictly adheres to the following syntax (given in EBNF):

Second Part = Line{ Line } <EOF>

Line       = Expression <CR>

Expression =Matrix | "(" Expression Expression ")"

Matrix     = "A" | "B" |"C" | ... | "X" | "Y" | "Z"

Output Specification

For each expressionfound in the second part of the input file, print one line containing the word"error" if evaluation of the expression leads to an error due tonon-matching matrices. Otherwise print one line containing the number ofelementary multiplications needed to evaluate the expression in the wayspecified by the parentheses.

Sample Input

9

A 50 10

B 10 20

C 20 5

D 30 35

E 35 15

F 15 5

G 5 10

H 10 20

I 20 25

A

B

C

(AA)

(AB)

(AC)

(A(BC))

((AB)C )

(((((DE)F)G)H)I)

(D(E(F(G(HI)))))

((D(EF))((GH)I))

Sample Output

0

0

0

error

10000

error

3500

15000

40500

47500

15125

代码:

#include<cstdio>

#include<stack>

#include<iostream>

#include<string>

using namespace std;

 

struct Matrix

{

    int a, b;

    Matrix(int a=0,int b=0):a(a),b(b) {}

} m[26];

 

stack<Matrix> s;

 

int main()

{

    int n;

    cin >> n;

    for(int i = 0; i < n; i++)

    {

        string name;

        cin >> name;

        int k = name[0] - 'A';

        cin >> m[k].a >> m[k].b;

    }

   

    string expr;

    while(cin >> expr)

    {

        int len = expr.length();

        bool error = false;

        int ans = 0;

        for(int i = 0; i < len; i++)

        {

            if(isalpha(expr[i]))

            {

                s.push(m[expr[i] - 'A']);

            }

            else if(expr[i] == ')')

            {

                Matrix m2 = s.top();

                s.pop();

                Matrix m1 = s.top();

                s.pop();

                if(m1.b != m2.a)

                {

                    error = true;

                    break;

                }

                ans += m1.a * m1.b * m2.b;

                s.push(Matrix(m1.a, m2.b));

            }

        }

        if(error)

        {

            printf("error\n");

        }

        else

        {

            printf("%d\n", ans);

        }

    }

    return 0;

}

0 0
原创粉丝点击