首页 > 其他 > 详细

UVa 442 - Matrix Chain Multiplication

时间:2015-03-23 21:50:42      阅读:272      评论:0      收藏:0      [点我收藏+]

题目:给你一些矩阵,以及一些矩阵间的乘法运算(包含括号),判断计算是否合法,合法输出结果。

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

说明:注意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;
}




UVa 442 - Matrix Chain Multiplication

原文:http://blog.csdn.net/mobius_strip/article/details/44569029

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!