UVa-442 Matrix Chain Multiplication

来源:互联网 发布:淘宝网店手机实名认证 编辑:程序博客网 时间:2024/05/29 09:27
#include <iostream>#include <cstdio>#include <stack>#include <string>using namespace std;struct MATRIX{    int row;    int col;    MATRIX(int row = 0, int col = 0) : row(row), col(col) {}} matrix[26];                           //因为26个英文字母stack<MATRIX> element;string letter, expr;                    //letter 矩阵字母表示 expr 表达式表示int n, num, ans;bool flag;int main(){    scanf("%d", & n);    while(n --)    {        cin >> letter;        num = letter[0] - 'A';          //变为结构体数组下标        cin >> matrix[num].row >> matrix[num].col;  //输入矩阵的 行 列    }    while(cin >> expr)                  //输入表达式    {        flag = true;                    //判断是否error        ans = 0;        for(int i = 0; i < (int)expr.length(); i ++)        {            if(isalpha(expr[i]))        //如果是字母 就将该字母所表达的矩阵投入栈                element.push(matrix[expr[i] - 'A']);            else if(expr[i] == ')')     //计算两个矩阵            {                MATRIX x2 = element.top();                element.pop();                MATRIX x1 = element.top();                element.pop();                if(x1.col != x2.row)                {                    flag = false;                    break;                }                else                {                    ans += x1.row * x1.col * x2.col;                    element.push(MATRIX(x1.row,x2.col)); //得到一个新的矩阵再投入栈                }            }        }        if(flag)                        //如果无错 输出ans            printf("%d\n", ans);        else            printf("error\n");    }    return 0;}

题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。假定A是m * n矩阵,B是n * p矩阵,那么AB是m * p矩阵,乘法次数为10 * 20 * 5(BC的乘法次数) + 50 * 10 * 5 ((A(BC))的乘法次数) = 3500。

题解:简单的表示式解析可以借助栈来完成。题目说过括号已经完整。所以遇到右括号运算即可。

0 0
原创粉丝点击