码迷,mamicode.com
首页 > 其他好文 > 详细

UVA442 Matrix Chain Multiplication

时间:2015-06-05 00:34:48      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <stack>
 5 
 6 using namespace std;
 7 
 8 struct Matrix {
 9     int r,c;
10     Matrix(int a = 0, int b = 0) : r(a), c(b) {};
11 }m[26];
12 
13 stack<Matrix> s;
14 
15 int main()
16 {
17     
18     int n;
19     cin >> n;
20     for (int i = 0; i < n; i++) {
21         string name;
22         cin >> name;
23         int k = name[0] - ‘A‘;
24         cin >> m[k].r >> m[k].c;
25         
26     }
27     
28     string expr;
29     while (cin >> expr) {
30         
31         int len = expr.size(); // 获取字符串的大小,因为这整个字符串都没有空格
32         bool error = false;
33         int ans = 0;
34         for (int i = 0; i < len; i++) { // 循环整个表达式、思路是遇到右括号就出栈两个Matrix进行计算,算完在压回。
35             // 其实你可以发现带括号的表达式十分符合栈,而不仅仅是该题目,首先左括号越深
36             // 其计算的有先级别越高,而右括号又和左括号配对,如果我们从左到右读取一个表达式
37             // 每次一遇到右括号,其前面到左括号的部分肯定就是这个表达式最优先的部分。
38             if (isalpha(expr[i])) { s.push(m[expr[i] - ‘A‘]); }
39             else if (‘)‘ == expr[i]) {
40                 Matrix m2 = s.top(); s.pop();
41                 Matrix m1 = s.top(); s.pop();
42                 if (m1.c != m2.r) { error = truebreak; }
43                 ans += m1.r * m1.c * m2.c;
44                 s.push(Matrix(m1.r, m2.c));
45             }
46             
47         }
48         
49         if (error) printf("error\n"); else printf("%d\n", ans);
50         
51     }
52     
53     return 0;
54 }
55 

2015/4/10下午6:32:37
By sixleaves

UVA442 Matrix Chain Multiplication

标签:

原文地址:http://www.cnblogs.com/objectc/p/4553401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!