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 

posted @ 2020-07-19 18:13  ACWink  阅读(139)  评论(0编辑  收藏  举报