UVA-442 Matrix Chain Multiplication

来源:互联网 发布:安徽仁通网络么样? 编辑:程序博客网 时间:2024/05/13 07:21

2016-08-17

UVA - 442 Matrix Chain Multiplication

题目大意:给出 n 个 矩阵名,行,列,然后给一些式子,求每个式子需要经过多少次计算(乘和加),括号内先算。

解题思路:首先要对矩阵乘法有一些了解。
A(xy)、B(xy)两个矩阵能否进行乘法运算的充要条件是是否满足 A.y == B.x,如果满足,则会得到矩阵C(A.xB.y),这次运算进行的乘法的次数是 A.x*A.y*B.y。
知道这个之后就简单了,创建一个矩阵类型的栈,遇到字母就入栈,遇到)就出栈。两个矩阵判断,可以相乘就计算运算次数,算完之后再把得到的矩阵入栈,若全程都没出现不能相乘的情况,就输出运算次数,否则 error。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int n;char str[10000];struct node {char z;int x, y;}s[200], stack[10000];int find(char c) {for (int i = 0; i < n; i++)if ( c == s[i].z )return i;}int main() {cin >> n;getchar();for (int i = 0; i < n; i++) {scanf("%c%d%d", &s[i].z, &s[i].x, &s[i].y);getchar();}while ( ~scanf("%s", str) ) {getchar();int num = 0;int tag = 1;int sum = 0;int len = strlen(str);if ( len == 1 ) {cout << "0" << endl;continue;}for (int i = 0; i < len; i++) {if ( str[i] >= 'A' && str[i] <= 'Z' ) {stack[num].z = s[find(str[i])].z;stack[num].x = s[find(str[i])].x;stack[num].y = s[find(str[i])].y;num++;}if ( str[i] == ')' ) {if ( stack[num-2].y != stack[num-1].x ) {tag = 0;break;}sum += stack[num-2].x * stack[num-2].y * stack[num-1].y;stack[num-2].y = stack[num-1].y;num--;}}if ( !tag )cout << "error" << endl;elsecout << sum << endl;}return 0;}


0 0
原创粉丝点击