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