UVA 442 Matrix Chain Multiplication

书上的代码
#include<stack>
#include<iostream>
#include<string>
using namespace std;

struct Matrix {
  int a, b;
  Matrix(int a=0, int b=0):a(a),b(b) {}
} m[26];

stack<Matrix> s;

int main() {
  int n;
  cin >> n;
  for(int i = 0; i < n; i++) {
    string name;
    cin >> name;
    int k = name[0] - 'A';
    cin >> m[k].a >> m[k].b;
  }
  string expr;
  while(cin >> expr) {
    int len = expr.length();
    bool error = false;
    int ans = 0;
    for(int i = 0; i < len; i++) {
      if(isalpha(expr[i])) s.push(m[expr[i] - 'A']);
      else if(expr[i] == ')') {
        Matrix m2 = s.top(); s.pop();
        Matrix m1 = s.top(); s.pop();
        if(m1.b != m2.a) { error = true; break; }
        ans += m1.a * m1.b * m2.b;
        s.push(Matrix(m1.a, m2.b));        
      }
    }
    if(error) printf("error\n"); else printf("%d\n", ans);
  }

  return 0;
}

我的代码
#include <iostream>
#include <map>
#include <string>
#include <cstdio>
#include <stack>
#include <cctype>
using namespace std;
int main()
{
  int num;
  pair<int,int> p[27];
  char ch;
  scanf("%d",&num);
  int tmp;
  for(int i=0;i<num;++num)
  {
    cin>>ch;
    tmp=ch-'A';
    cin>>p[tmp].first>>p[tmp].second;
  }
  string str;
  while(cin>>str)
  {
    stack<pair<int,int> > s;
    int lenth=str.size();
    bool flag=false;
    int res=0;
    for(int i=0;i<lenth;++i)
    {
      if(isalpha(str[i]))
      {
        s.push(p[str[i]-'A']);
      }
      else if(str[i]==')')
      {
        pair<int,int> t1=s.top();
        s.pop();
        pair<int,int> t2=s.top();
        s.pop();
        if(t2.second!=t1.first)
        {
          flag=true;
          break;
        }
        res+=t2.first*t2.second*t1.first;
      }
    }
    if(flag)
    printf("error\n");
    else 
    printf("%d\n",res);    
  }
  return 0;
}
我的就超时= =

你可能感兴趣的:(栈,uva)