UVa OJ Matrix Chain Multiplication 矩陣鏈乘 442

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章