UVa OJ Matrix Chain Multiplication 矩陣鏈乘 442
解題思路:
棧。AC代碼如下,僅供參考。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<stack>
#define MAXN 26
using namespace std;
typedef struct node{
char name;
int x;
int y;
}MATRIX;
MATRIX mtr[MAXN];
int n;
int getPos(char t){
for(int i=0;i<n;i++)
if(mtr[i].name==t)
return i;
return -1;
}
int main(){
#ifdef LOCAL
freopen("442_input.txt","r",stdin);
freopen("442_output.txt","w",stdout);
#endif
char s[100];
vector<int>m_x;
vector<int>m_y;
while(scanf("%d\n",&n)==1){
for(int i=0;i<n;i++)
scanf("%c%d%d\n",&mtr[i].name,&mtr[i].x,&mtr[i].y);
while(scanf("%s",s)==1){
m_x.clear();m_y.clear();
int sum=0,len=strlen(s),fa=0;
int st,ed;
if(len==1){
if(getPos(s[0])==-1)fa=1;
else sum=0;
}
else{
for(int i=0;i<len;i++){
if(s[i]=='('){
m_x.push_back(-2);
m_y.push_back(-2);
}
else if(s[i]==')'){
ed=m_x.size();
for(st=ed-1;st>=0;st--)
if(m_x.at(st)==-2)
break;
st++;
int mx=m_x.at(st),my=m_y.at(st);
for(int j=st+1;j<ed;j++){
if(my==m_x.at(j)){
sum+=mx*my*m_y.at(j);
my=m_y.at(j);
}
else{
fa=1;
i=len+1;
break;
}
}
m_x.erase(m_x.begin()+st-1,m_x.begin()+ed);
m_y.erase(m_y.begin()+st-1,m_y.begin()+ed);
m_x.push_back(mx);m_y.push_back(my);
}
else{
int pos=getPos(s[i]);
if(pos==-1){
fa=1;
i=len+1;
break;
}
else{
m_x.push_back(mtr[pos].x);
m_y.push_back(mtr[pos].y);
}
}
}
}
if(fa)cout<<"error"<<endl;
else cout<<sum<<endl;
}
}
return 0;
}