UVa-442 Matrix Chain Multiplication

#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。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值