UVa 442 ------ Matrix Chain Multiplication

来源:互联网 发布:燕雀焉知鸿鹄之志图片 编辑:程序博客网 时间:2024/04/30 13:55

题目: UVa 442


题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的步数。若乘法无法进行,输出error。

    如A m*n, B n*p, 那么A*B的步数为m*n*p;若A的列数不等于B的行数,乘法无法进行


思路:若遇到字母,则将相应矩阵入栈;

   若遇到右括号,则取栈顶的两个元素相乘(注意两个矩阵的顺序),累加步数,并将相乘的结果入栈


代码:

/*UVa 442 矩阵链乘*/#include <cstdio>#include <stack>#include <iostream>#include <string>using namespace std;struct Mat{int r, c;Mat(int a = 0, int b = 0):r(a), c(b){}}m[26];stack<Mat> s;int main(){int n;scanf("%d", &n);for (int i = 0; i < n; ++i){//n个矩阵的存储string name;cin >> name;int k = name[0] - 'A';cin >> m[k].r >> m[k].c;}string tmp;while (cin >> tmp){int len = tmp.length();bool error = false;int ans = 0;for (int i = 0; i < len; ++i){if (isalpha(tmp[i])) //字母,则入栈s.push(m[tmp[i] - 'A']);else if (tmp[i] == ')'){ //遇到又括号,k2,k1依次出栈,累加上步数,并将矩阵相乘结果入栈Mat k2 = s.top(); s.pop();Mat k1 = s.top(); s.pop();//注意后取的为k1, 运算k1*k2if (k1.c != k2.r){error = true;break;}else{ans += (k1.r * k1.c * k2.c);s.push(Mat(k1.r, k2.c));}}}//for(i)if (error){printf("error\n");}else{printf("%d\n", ans);}}//while(tmp)return 0;}


0 0
原创粉丝点击