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;
}
- 442 - Matrix Chain Multiplication***
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- 442 - Matrix Chain Multiplication
- UVa 442 Matrix Chain Multiplication
- Uva 442 Matrix Chain Multiplication
- UVa 442 Matrix Chain Multiplication
- uva 442 - Matrix Chain Multiplication
- UVa 442 - Matrix Chain Multiplication
- UVa 442 - Matrix Chain Multiplication
- UVa 442 Matrix Chain Multiplication
- UVA 442 Matrix Chain Multiplication
- uva 442 - Matrix Chain Multiplication
- 122 - Trees on the level
- Dynamics CRM 2015 New Feature (3): Hierarchical Security Model
- 210 - Concurrency Simulator
- 297 - Quadtrees
- 【Uni2D】GenericValueEntry、MultiValueDictionary
- 442 - Matrix Chain Multiplication
- 506 - System Dependencies
- 514 - Rails
- 完整java开发中JDBC连接数据库代码和步骤
- HDU 1757 A Simple Math Problem (矩阵+快速幂)
- 548 - Tree
- 572 - Oil Deposits
- 679 - Dropping Balls
- 699 - The Falling Leaves