UVa442 Matrix Chain Multiplication (栈)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa442 Matrix Chain Multiplication (栈)相关的知识,希望对你有一定的参考价值。

链接:http://acm.hust.edu.cn/vjudge/problem/19085
分析:用栈来实现一个简单的表达式求值。输入表达式保证合法,比如(A(BC))把BC看成一个整体D那么(A(BC))就是AD,所以这些表达式都是在不断重复嵌套相同的结构A*B。遍历表达式,遇到字母则将对应矩阵压入栈中,遇到右括号则将栈顶两个矩阵弹出,判断是否能进行乘法,如果能则累加乘法次数,再将相乘后的矩阵压栈,如果不能则将error置为true,退出循环。

 1 #include <iostream>
 2 #include <string>
 3 #include <stack>
 4 using namespace std;
 5 
 6 struct Matrix {
 7     int a, b;
 8     Matrix(int a = 0, int b = 0): a(a), b(b) {}
 9 } m[26];
10 
11 stack<Matrix> s;
12 
13 int main() {
14     int n;
15     cin >> n;
16     for (int i = 0; i < n; i++) {
17         string name;
18         cin >> name;
19         int k = name[0] - A;
20         cin >> m[k].a >> m[k].b;
21     }
22     string expr;
23     while (cin >> expr) {
24         int len = expr.length();
25         bool error = false;
26         int ans = 0;
27         for (int i = 0; i < len; i++) {
28             if (isalpha(expr[i])) s.push(m[expr[i] - A]);
29             else if (expr[i] == )) {
30                 Matrix m2 = s.top(); s.pop();
31                 Matrix m1 = s.top(); s.pop();
32                 if(m1.b != m2.a) { error = true; break; }
33                 ans += m1.a * m1.b * m2.b;
34                 s.push(Matrix(m1.a, m2.b));
35             }
36         }
37         if (error) cout << "error" << endl; else cout << ans << endl;
38     }
39     return 0;
40 }

 

以上是关于UVa442 Matrix Chain Multiplication (栈)的主要内容,如果未能解决你的问题,请参考以下文章

UVA - 442 Matrix Chain Multiplication(栈模拟水题+专治自闭)

Matrix Chain Multiplication (堆栈)

442 - Matrix Chain Multiplication

HDU 1082 Matrix Chain Multiplication

UVa 442 矩阵链乘

栈-uva 442