UVA442 矩阵链乘 Matrix Chain Multiplication
这还是一个栈的问题。
通过给出的表达式,首先声明不会出现(A*B*C)像这样的情况,线性代数不允许这样。
所以通过将字母对应的矩阵入栈。当遇到右括号时有唯一匹配,所以可以取出栈顶两个元素运算。
1 #include <iostream>
2 #include <stack>
3 #include <string>
4 #include <algorithm>
5 using namespace std;
6
7 struct Matrix {
8 int a, b;
9 Matrix(int a = 0, int b = 0):a(a),b(b){}
10
11 }m[26];
12
13 stack<Matrix> s;
14
15 int main () {
16 int n;
17 cin >> n;
18 for (int i = 0; i < n; ++ i) {
19 string name;
20 cin >> name;
21 int k = name[0] - 'A';
22 cin >> m[k].a >> m[k].b;
23 }
24
25 string expr;
26 while(cin >> expr) {
27 int len = expr.length();
28 bool error = false;
29 int ans = 0;
30 for (int i = 0; i < len; ++ i)
31 {
32 if (isalpha(expr[i])) s.push(m[expr[i] - 'A']);//是字母入栈
33 else if(expr[i] == ')') {//出栈并判断运算入栈。
34 Matrix m2 = s.top(); s.pop();
35 Matrix m1 = s.top(); s.pop();
36 if (m1.b != m2.a ) {
37 error = true;
38 break;
39 }
40 ans += m1.a * m1.b * m2.b;
41 s.push(Matrix(m1.a, m2.b));
42 }
43 }
44 if(error) cout << "error" << endl;
45 else cout << ans << endl;
46 }
47 return 0;
48 }
49
50
51
52
53
54
追求吾之所爱
浙公网安备 33010602011771号