Matrix Chain Multiplication UVA - 442

原题链接

模拟矩阵相乘,感觉表达式计算基本是用栈吧,题目不难,但我WA两次,因为没有注意括号内必定有两个矩阵且矩阵相乘我搞成只要a.x==b.y||a.y==b.x就可以相乘,实际上是不允许调换位置的,tmd把简单程序写复杂了

注意scanf("%c")与getline要尤为注意换行符

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 typedef pair<int,int> pii;
 5 unordered_map<char,pair<int,int> > um;
 6 //一个括号只能扩两个表达式 
 7 int main()//矩阵相乘 AB只能是A的列=B的行,不允许换位置 
 8 {
 9 //    freopen("in.txt","r",stdin);
10 //    freopen("out.txt","w",stdout);
11     int n;
12     scanf("%d",&n);
13 //    getchar();//getline与scanf("%c")的三省吾身 
14     for(int i=1;i<=n;i++){
15         char c; int x,y;
16         cin>>c>>x>>y;
17         pii p; p.first = x; p.second = y;
18         um[c] = p;
19     }
20     string str;
21     while(cin>>str){
22         bool isover = false;
23         ll sum = 0;
24     //    printf("%s\n",str.c_str());
25         stack<pii> s;
26         for(int i=0;i<str.size();i++){
27             if(isalpha(str[i])) s.push(um[str[i]]);
28             else if(str[i]==')'){
29                     pii a = s.top(); s.pop();
30                     pii b = s.top(); s.pop();
31                     if(a.first!= b.second){
32                         isover = true;
33                         printf("error\n"); break;
34                     }else if(a.first==b.second){
35                         sum+=b.first*a.second*b.second;
36                         pii now; now.first = b.first; now.second = a.second;
37                         s.push(now);
38                     }
39                 }
40             }
41             if(!isover)    printf("%lld\n",sum);
42         }
43     return 0; 
44 }
45         

 

上一篇:【kuangbin带你飞-区间DP-3】E - Multiplication Puzzle POJ-1651


下一篇:E. String Multiplication dp