UVA442 Matrix Chain Multiplication

 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 =  true break ; }
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

你可能感兴趣的:(Matrix)