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

UVA - 442 Matrix Chain Multiplication

2014-09-27 12:48 405 查看
题目大意:给出一系列矩阵,然后再给一系列表达式,求一个有几个元素相乘

解题思路:用栈来存储,遇到右括号就弹出两个,然后把结果相加,再压入变换后的矩阵

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

struct Matrix {
	int r;
	int c;
	char name;
};

Matrix m[100];

int main() {

	int test;
	char str[100];
	scanf("%d", &test);
	getchar();
	for(int i = 0; i < test; i++) {
		scanf("%c", &(m[i].name));
		scanf("%d", &(m[i].r));
		scanf("%d", &(m[i].c));	
		getchar();
	}

	/*	for(int i = 0 ; i < test; i++) {
		printf("%c %d %d\n",m[i].name, m[i].r, m[i].c);
		}
		*/
	while(gets(str)) {
		int len = strlen(str);
		Matrix left , right, temp;
		int number = 0, mark = 0;;
		stack<Matrix> s;
		if(len == 1) {
			printf("0\n");
			continue;
		}	
		else {
			for(int i = 0; i < len; i++) {
				if(str[i] >= 'A' && str[i] <= 'Z')//提取字母,将相应的压入栈
					for(int j = 0; j < test; j++) 
						if(str[i] == m[j].name) {
							s.push(m[j]);
							break;
						}
				if(str[i] == ')') {
					right = s.top();
					s.pop();
					left = s.top();
					s.pop();
					temp.r = left.r;
					temp.c = right.c;
					if(left.c == right.r)
						number = number + left.r * left.c * right.c	;
					else {
						mark++;
						break;
					}
					s.push(temp);
				}
			}	

			if(mark == 1)
				printf("error\n");			
			else
				printf("%d\n",number);
		}

	}
	return 0;	

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: