理解

题意比较简单,时间长没有碰数学者或许需要一两分钟回想一下矩阵的乘法。

可以看一下同济大学的线代教材中给出的矩阵的相乘的公式,

看一下输入和输出,

输入

这里有个术语: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}