hello kity
期待您的批阅,由于写解题报告时 不一定考虑的很周到,所以如果您有什么不懂的地方,请您留言,然而一天之内我肯定会看见您信息,再对代码注释详细,让您更好的阅读
分类
最新评论
最新留言
链接
RSS
计数器
223066
功能
POJ (2246) Matrix Chain Multiplication
spoiler
posted @ 2011年4月08日 15:56
in Ecole Polytechnique Contest 解题报告
, 1700 阅读
题目分析:简单的后缀表达式,把每个表达式存放在string 变量里,然后从前到后遍历一边,当遇到'('直接存放在记录运算符的栈里,如果是 字母就把这个字母对应的 节点存放在,记录运算节点的栈里!最后当遇到 ')' 如果记录运算符号的栈里为空,就说明 括号不对称!所以得出error!否则把栈里的'('的出栈!然后把记录运算节点的栈里取出两个运算节点!对这两个节点进行判断,是否满足矩阵运算规则,如果不满足,判错!满足的话记录下他们的乘积!并且 将两个节点合并成一个节点 存放回 在记录运算节点的栈里!
算法详细过程 就是这样 下面是我的代码 如有改正的地方请您留言 谢谢
#include<iostream> #include<stdio.h> #include<stack> #include<cstring> using namespace std; struct node{ int x,y; }s[30]; int n; void input(){ char c; while(n--){ cin>>c; int t=c-'A'; cin>>s[t].x>>s[t].y; } } int cal(string str){ int i,k=str.length(),ans=0; struct node a,b; stack<char>sn; stack<struct node>st; for(i=0;i<k;i++){ if(str[i]=='(') sn.push(str[i]); else if(str[i]>='A'&&str[i]<='Z') st.push(s[str[i]-'A']); else{ if(sn.empty()) return -1; sn.pop(); b=st.top(); st.pop(); a=st.top(); st.pop(); if(a.y!=b.x) return -1; ans+=a.x*b.x*b.y; a.y=b.y; st.push(a); } } return ans; } int main(){ int sum; string str; cin>>n; input(); while(cin>>str){ sum=cal(str); if(sum==-1) printf("error\n"); else printf("%d\n",sum); } return 0; }