uva 442

题意:计算矩阵连乘的计算次数   ,每一次相乘次数都是 新矩阵的R*C * N(旧的矩阵的列)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct node 
{
	char name ;
	int row;
	int col;
};
node m[1000];
node stack1[1000];
char a[1000],b[1000],stack2[1000];

int main()
{
	int j,n,sum,top1,top2;
	cin>>n;
	for (int i = 0 ; i < n ; i++)
	{
		cin>>m[i].name;
		cin>>m[i].row>>m[i].col;
	}
	while (cin>>a)
	{
		j=0,sum=0,top1=-1,top2=-1;
        // 这一段是检查是否可以构成连乘
		for (int i = 0 ; i < strlen(a) ; i++)
			if(isupper(a[i]))
			{
				b[j] = a[i];
				j++;		
			}
		b[j] = '\0' ;
		int flag = 0;
		for (int i = 0 ; i < strlen(b)-1 ; i++ )  //矩阵连乘时的性质,所以从左到右扫描一边是成立的
			if (m[b[i]-'A'].col!=m[b[i+1]-'A'].row)
			{
				flag = 1;
				break;
			}
		if (flag ==1)
		{
			puts("error");
			continue;
		}
		else // 开始计算   
		{
			for (int i=0; i<(int)strlen(a); i++)
			{
				if (isalpha(a[i]))
				{
					top1++;
					stack1[top1]=m[a[i]-'A'];
				}
				if (a[i] == '(')
				{
					top2++;
					stack2[top2] = '(';
				}
				if ( a[i] == ')')
				{ 
					top2--;
					sum+=stack1[top1].row*stack1[top1].col*stack1[top1-1].row;  
					top1--;
					stack1[top1].col=stack1[top1+1].col;
				}
			}
			cout<<sum<<endl;
		}
	}
	return 0;
}



你可能感兴趣的:(uva 442)