UVA442 矩阵链乘
UVA442 矩阵链乘
字符输入在第一个位置和最后一个位置都很恶心!
题目详情
解题思路
此题重点在于理解表达式的递归调用,即:
\[SecondPart = Line { Line } <EOF>\\
Line = Expression <CR>\\
Expression = Matrix | "(" Expression Expression ")"\\
Matrix = "A" | "B" | "C" | ... | "X" | "Y" | "Z"\\
\]
#include<iostream>
#include<vector>
#include<cstdio>
#include<string>
#include<stack>
using namespace std;
vector<pair<int, int>> mp(26, pair<int, int> (0, 0));
void fun() {
char ch[100];
int arr[100];
for (int i = 0; i < 20; i++) arr[i] = ch[i] - '0';
}
int main() {
int n, r, c;
string name;
string expr;
scanf("%d", &n);
while (n --) {
cin >> name;
scanf("%d%d", &r, &c);
mp[name[0] - 'A'] = make_pair(r, c);
}
while (cin >> expr) {
stack<pair<int, int>> stk;
bool error = false;
int ans = 0;
for (int i = 0; i < expr.size(); i++) {
if (isalpha(expr[i])) stk.push(mp[expr[i] - 'A']);
else if (expr[i] == ')') {
pair<int, int> m1, m2;
m2 = stk.top(); stk.pop();
m1 = stk.top(); stk.pop();
if (m1.second != m2.first) {
error = true;
break;
} else ans += m1.first * m1.second * m2.second;
stk.push(make_pair(m1.first, m2.second));
}
}
if (error) printf("error\n");
else printf("%d\n", ans);
}
return 0;
}