Loading

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;
}
posted @ 2020-11-21 15:49  mayapony  阅读(50)  评论(0编辑  收藏  举报