您的位置:首页 > 大数据 > 人工智能

UVa 442 - Matrix Chain Multiplication

2015-03-23 20:45 471 查看
题目:给你一些矩阵,以及一些矩阵间的乘法运算(包含括号),判断计算是否合法,合法输出结果。

分析:模拟,递归。见到括号直接递归调用,每次判断乘法左边的行是否等于右边的列即可。

说明:注意cin的读数据的情况,会RE,(zoj1094)。

#include <iostream>
#include <cstring>

using namespace std;

struct node
{
	int 		L,R;
	long long	V;
}Matrix[ 27 ],Error;

bool Flag;

node Calculate( char* Data, int s, int e )
{
	int  count = 0;
	node Save[ 2 ];
	for ( int i = s ; i <= e ; ++ i )
		if ( Data[ i ] == '(' ) {
			int start = i + 1;
			int untop = 1;
			while ( untop && ++ i ) {
				if ( Data[ i ] == '(' ) ++ untop;
				if ( Data[ i ] == ')' ) -- untop;
			}
			Save[ count ++ ] = Calculate( Data, start, i-1 );
			if ( Flag ) return Error;
		}else 
			Save[ count ++ ] = Matrix[ Data[ i ]-'A' ];
			
	node Now = Save[ 0 ];
	for ( int i = 1 ; i < count ; ++ i ) {
		if ( Now.R != Save[ i ].L ) {
			Flag = true;
			return Error;
		}
		Now.V = Now.V + Save[ i ].V + Now.L*Now.R*Save[ i ].R;
		Now.R = Save[ i ].R;
	}
	return Now;
}

char Data[ 260 ];

int main()
{
	int  n;
	char C;
	cin >> n;
	for ( int i = 0 ; i < n ; ++ i ) {
		cin >> C; //从后向前运算的,写在一起就 RE 了。。。 
		cin >> Matrix[ C-'A' ].L >> Matrix[ C-'A' ].R;
		Matrix[ C-'A' ].V = 0LL;
	}
	while ( cin >> Data ) {
		Flag = false;
		node Answer = Calculate( Data, 0, strlen( Data )-1 );
		if ( Flag )
			cout << "error" << endl;
		else 
			cout << Answer.V << endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: