理解
题意比较简单,时间长没有碰数学者或许需要一两分钟回想一下矩阵的乘法。
可以看一下同济大学的线代教材中给出的矩阵的相乘的公式,
看一下输入和输出,
输入
这里有个术语:EBNF,这是编译原理里面的一个很简单的一个范式,上过课的应该都有印象,如果需要,再去翻一下书即可。
注意这个条件,
1Expression = Matrix | "(" Expression Expression ")"
可以推出,括号里面只可以出现一对单独的矩阵,也就是两个单独的矩阵,e.g. (AB)
,或者,一个矩阵加上另一对括号括起来的矩阵,e.g. (A(AB))
,以此类推。因此,我们可以在遇到右括号的时候,一次出栈两个栈中的元素,
1else if (expr[i] == ')') {
2 Matrix m2 = s.top();
3 s.pop();
4 Matrix m1 = s.top();
5 s.pop();
6 ...
7}
输出
理解一下题目中的例子即可。
代码
1#include <cstdio>
2#include <cctype>
3#include <stack>
4#include <iostream>
5#include <string>
6
7using namespace std;
8
9struct Matrix {
10 int a, b;
11 Matrix(int a = 0, int b = 0) : a(a), b(b) {}
12} m[26];
13
14stack<Matrix> s;
15
16int main(int argc, char *argv[]) {
17 int n;
18 cin >> n;
19 for (int i = 0; i < n; i++) {
20 string name;
21 cin >> name;
22 int k = name[0] - 'A';
23 cin >> m[k].a >> m[k].b;
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 if (isalpha(expr[i]))
32 s.push(m[expr[i] - 'A']);
33 else if (expr[i] == ')') {
34 Matrix m2 = s.top();
35 s.pop();
36 Matrix m1 = s.top();
37 s.pop();
38 if (m1.b != m2.a) {
39 error = true;
40 break;
41 }
42 ans += m1.a * m2.a * m2.b;
43 s.push(Matrix(m1.a, m2.b));
44 }
45 }
46 if (error)
47 cout << "error\n";
48 else
49 cout << ans << "\n";
50 }
51 return 0;
52}