uva 442 Matrix Chain Multiplication

来源:互联网 发布:布鲁克林警察 知乎 编辑:程序博客网 时间:2024/06/08 19:15

see:https://cn.vjudge.net/problem/UVA-442


因为确保括号是匹配的,所以左括号不处理,字母直接入栈,右括号时取栈顶两个出栈计算,并将新的入栈


//@auther zhou//@Number 201408070203//@start time://@finish time:/*@此处注意:*//* 测试数据*/#include<iostream>#include<cstring>#include<vector>#include<cmath>#include<algorithm>#include<stack>using namespace std;struct matrix{int lf,rt;matrix(int lf=0,int rt=0){lf=lf;rt=rt;}};int main(){int k;cin>>k;matrix temp;matrix all[26];char tmp;for(int i=0;i<k;i++){cin>>tmp>>temp.lf>>temp.rt;all[tmp-'A']=temp;}stack<matrix> calculate;string tocal;cin>>tocal;while(!cin.eof()){int flag=0;//flag=0 不错,=1,出错int total=0;for(int i=0;i<tocal.length();i++){if(tocal[i]=='('){//遇左括号,不处理 }else if(isalpha(tocal[i])){calculate.push(all[tocal[i]-'A']);}else{//右括号,出栈计算 matrix r2=calculate.top();calculate.pop();matrix r1=calculate.top();calculate.pop();if(r1.rt!=r2.lf){flag=1;//cout<<"r1.rt"<<r1.rt<<" "<<"r2.lf"<<r2.lf<<endl;break;}else{total+=r1.lf*r1.rt*r2.rt;}matrix ans;ans.lf=r1.lf;ans.rt=r2.rt;calculate.push(ans);//cout<<"push了一个"<<r1.lf<<" "<<r2.rt<<"的矩阵\n"; }} if(flag){cout<<"error"<<endl;}else{cout<<total<<endl;}cin>>tocal;}return 0;}



原创粉丝点击