【棧解析表示式】例題6-3 UVa - 442

CN_swords發表於2017-04-30


/*
演算法競賽入門 LRJ 例題6-3(UVA - 442)Matrix Chain Multiplication
棧解析表示式
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<algorithm>
#include<deque>
typedef long long LL;
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
const int INF=0x3f3f3f3f;
const int N = 10010;

struct node
{
    int l,r;
}a[30];
stack<node> Q;
string s;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        getchar();
        char c;
        scanf("%c",&c);
        scanf("%d%d",&a[c-'A'].l,&a[c-'A'].r);
    }
    while(cin >> s)
    {
        int ans = 0;
        bool flag = true;
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] == ')')
            {
                node x2 = Q.top();
                Q.pop();
                node x1 = Q.top();
                Q.pop();
                if(x1.r != x2.l)
                {
                    flag = false;
                    break;
                }
                else
                {
                    ans += x1.l*x1.r*x2.r;
                    x1.r = x2.r;
                    Q.push(x1);
                }
            }
            else if(s[i] >= 'A' && s[i] <= 'Z')
                Q.push(a[s[i]-'A']);
        }
        if(!flag)   puts("error");
        else    printf("%d\n",ans);
    }
    return 0;
}


相關文章