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

UVa 442 (栈) Matrix Chain Multiplication

2015-01-26 20:49 225 查看
题意:

给出一个矩阵表达式,计算总的乘法次数。

分析:

基本的数学知识:一个m×n的矩阵A和n×s的矩阵B,计算AB的乘法次数为m×n×s。只有A的列数和B的行数相等时,两个矩阵才能进行乘法运算。

表达式的处理:可以用一个栈来存储,遇到字母入栈,遇到右括号将栈顶两个元素出栈,然后将乘积入栈。

#include <cstdio>
#include <cstring>

const int maxn = 30;
int n;
char s[100];

struct Matrix
{
int n, m;
Matrix(int n=0, int m=0):n(n), m(m) {}
int times(const Matrix& rhs) const
{
if(m == rhs.n) return n * m * rhs.m;
return -1;
}
Matrix operator * (const Matrix& rhs) const
{ return Matrix(n, rhs.m); }
}mat[maxn], stack[maxn];

int ID(char c) { return c - 'A'; }

int main()
{
//freopen("in", "r", stdin);
scanf("%d", &n);
getchar();
for(int i = 0; i < n; ++i)
{
int n, m;
char name;
scanf("%c %d %d", &name, &n, &m);
getchar();
mat[ID(name)] = Matrix(n, m);
}

while(scanf("%s", s) == 1)
{
int l = strlen(s);
int ans = 0, p = 0, ok = 1;
for(int i = 0; i < l; ++i)
{
if(s[i] == '(') continue;
else if(s[i] == ')')
{
Matrix B = stack[--p];
Matrix A = stack[--p];
int t = A.times(B);
if(t != -1)
{
ans += t;
stack[p++] = A * B;
}
else { ok = 0; break; }
}
else
{
stack[p++] = mat[ID(s[i])];
}
}

if(ok) printf("%d\n", ans);
else puts("error");
}

return 0;
}


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