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

UVA-442 Matrix Chain Multiplication

2016-08-17 20:46 423 查看
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;
else
cout << sum << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: