_xiaobai_

导航

zoj1094 Matrix Chain Multiplication(模拟)

/*

简单的模拟:可以用栈,也可以用递归实现

*/

View Code
 1 #include <iostream>
2 #include <cstring>
3
4 using namespace std;
5
6 struct node
7 {
8 int L,R;
9 long long V;
10 }Matrix[ 27 ],Error;
11
12 bool Flag;
13
14 node Calculate( char* Data, int s, int e )
15 {
16 int count = 0;
17 node Save[ 2 ];
18 for ( int i = s ; i <= e ; ++ i )
19 if ( Data[ i ] == '(' ) {
20 int start = i + 1;
21 int untop = 1;
22 while ( untop && ++ i ) {
23 if ( Data[ i ] == '(' ) ++ untop;
24 if ( Data[ i ] == ')' ) -- untop;
25 }
26 Save[ count ++ ] = Calculate( Data, start, i-1 );
27 if ( Flag ) return Error;
28 }else
29 Save[ count ++ ] = Matrix[ Data[ i ]-'A' ];
30
31 node Now = Save[ 0 ];
32 for ( int i = 1 ; i < count ; ++ i ) {
33 if ( Now.R != Save[ i ].L ) {
34 Flag = true;
35 return Error;
36 }
37 Now.V = Now.V + Save[ i ].V + Now.L*Now.R*Save[ i ].R;
38 Now.R = Save[ i ].R;
39 }
40 return Now;
41 }
42
43 char Data[ 260 ];
44
45 int main()
46 {
47 int n;
48 char C;
49 cin >> n;
50 for ( int i = 0 ; i < n ; ++ i ) {
51 cin >> C; //从后向前运算的,写在一起就 RE 了。。。
52 cin >> Matrix[ C-'A' ].L >> Matrix[ C-'A' ].R;
53 Matrix[ C-'A' ].V = 0LL;
54 }
55 while ( cin >> Data ) {
56 Flag = false;
57 node Answer = Calculate( Data, 0, strlen( Data )-1 );
58 if ( Flag )
59 cout << "error" << endl;
60 else
61 cout << Answer.V << endl;
62 }
63 return 0;
64 }

posted on 2011-08-18 01:48  _xiaobai_  阅读(269)  评论(0编辑  收藏  举报