M.J的blog

algorithm,ACM-ICPC
随笔 - 39, 文章 - 11, 评论 - 20, 引用 - 0
数据加载中……

TOJ 1135 Matrix Chain Multiplication

很简单的题,给定N个矩阵,然后给出一系列运算式,用括号来限制运算,最后求一共进行了多少次乘法运算。
R(m,s) 和Q(s,n)相乘,要进行m*s*n次~
处理运算先后的时候,用栈实现,即后进先出就可以了。
Sample Input:
9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))
Sample Outout:
0
0
0
error
10000
error
3500
15000
40500
47500
15125
Code:
#include <iostream>
#include 
<cstdio>
#include 
<string>
#include 
<map>
using namespace std;

struct Matrx{
        
char id;
        
int x,y;
}a[
30];
Matrx stack[
100];
int main()
{
        
int i,j,k,n,ans;
        
bool flag;
        map
<char,int>mark;
        scanf(
"%d",&n);
        
for(i = 1;i <= n; i++){
                cin 
>> a[i].id;
                scanf(
"%d%d",&a[i].x,&a[i].y);
                mark[a[i].id] 
= i;
        }
        
string str;
        
while(cin>>str){
                ans 
= 0; flag = true;
                
int len = str.length();
                
int head,tail;
                head 
= tail = 0;
                
for(i = 0;i <len; i++){
                        
if(str[i] == '(')
                                
continue;
                        
else if(str[i] == ')'){     //pop
                                if(head == 1)
                                        head 
--;
                                
else if(head > 1){
                                        
int tx = stack[head-2].x;
                                        
int ty = stack[head-1].y;
                                        
if(stack[head-2].y != stack[head-1].x) flag = false;
                                        ans 
+= stack[head-2].x*stack[head-2].y*stack[head-1].y;
                                        head 
-= 2;
                                        stack[head].x 
= tx;
                                        stack[head
++].y = ty;
                                }

                        }
                        
else{        // push
                                stack[head++= a[mark[str[i]]];

                        }
                }
                
if(!flag) printf("error\n");
                
else printf("%d\n",ans);
        }
}




posted on 2010-06-12 22:10 M.J 阅读(159) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理