Matrix Chain Multiplication (堆栈)

题目链接:https://vjudge.net/problem/UVA-442

题目大意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。 假定A是m*n的矩阵,B是n*p的矩阵,乘法次数为m*n*p。如果A的列数不等于B的行数,则乘法

无法进行。

  例如A是50*10的,B是10*20的,C是20*5的,则(A(BC))的乘法次数为10*20*5(BC的乘法次数)+50*10*5((A(BC)的乘法次数)=3500

分析:本题的关键是解析表达式,本题的表达式比较简单,可以用一个栈来完成,遇到字母时入栈,遇到右括号时出栈并计算,然后结果入栈。 因为保证输入合法,括号无需入栈

#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=26+5;
struct Matrix
{
    int a,b;
    //Matrix (int a=0,int b=0):a(a),b(b){}
    Matrix (int c=0,int d=0)
    {
        a=c;
        b=d;
    }
}m[maxn];
stack<Matrix> s;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        string name;
        cin>>name;
        int k=name[0]-‘A‘;//存下标
        cin>>m[k].a>>m[k].b;
    }
    string expr;
    while(cin>>expr)
    {
        int len=expr.length();
        bool error=false;
        int ans=0;
        for(int i=0;i<len;i++)
        {
            if(isalpha(expr[i])) s.push(m[expr[i]-‘A‘]);//是否是字母  也就是矩阵  是的话入栈
            else if(expr[i]==‘)‘)
            {
                Matrix m2=s.top(); s.pop();//取两个字符
                Matrix m1=s.top(); s.pop();
                if(m1.b!=m2.a)
                {
                    error=true;
                    break;
                }
                ans+=m1.a*m1.b*m2.b;
                s.push(Matrix(m1.a,m2.b));
            }
        }
        if(error) cout<<"error"<<endl;
        else cout<<ans<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/caijiaming/p/10340888.html

时间: 2024-12-26 20:20:14

Matrix Chain Multiplication (堆栈)的相关文章

UVA 442 二十 Matrix Chain Multiplication

Matrix Chain Multiplication Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 442 Appoint description:  System Crawler  (2015-08-25) Description Suppose you have to evaluate an expression like A*B*C*D*E

stack UVA 442 Matrix Chain Multiplication

题目传送门 /* stack 容器的应用:矩阵的表达式求值 A 矩阵是a * b,B 矩阵是b * c,则A * B 是a * c */ #include <cstdio> #include <iostream> #include <algorithm> #include <stack> #include <cmath> #include <cstring> #include <string> using namespac

[2016-02-05][UVA][442][Matrix Chain Multiplication]

[2016-02-05][UVA][442][Matrix Chain Multiplication] UVA - 442 Matrix Chain Multiplication Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Suppose you have to evaluate an expression like A*B*C*D*E where

UVa 442 Matrix Chain Multiplication(矩阵链乘,模拟栈)

题意  计算给定矩阵链乘表达式需要计算的次数  当前一个矩阵的列数等于后一个矩阵的行数时  他们才可以相乘  不合法输出error 输入是严格合法的  即使只有两个相乘也会用括号括起来  而且括号里最多有两个 那么就很简单了 遇到字母直接入栈  遇到反括号计算后入栈  然后就得到结果了 #include<cstdio> #include<cctype> #include<cstring> using namespace std; const int N = 1000;

UVa442 Matrix Chain Multiplication(矩阵链乘)

UVa442 Matrix Chain Multiplication(矩阵链乘) 题目链接:Uva442 题目描述:输入n个矩阵的维度和一个矩阵链乘的表达式,输出乘法的次数,如果乘法无法进行,则输出error. 题目分析: 栈对表达式求值有着特殊的作用,本题表达式简单,可以用一个栈来完成,遇到字母时入栈,遇到右括号时出栈并且计算,之后算出的结果入栈. <<<<<<<<<<<<<<<<<<<&l

UVA Matrix Chain Multiplication

题目如下: Matrix Chain Multiplication Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is associative, the order in which multiplications are performed is arbitrary. However, the numb

442 - Matrix Chain Multiplication

Matrix Chain Multiplication Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is associative, the order in which multiplications are performed is arbitrary. However, the number of

Matrix Chain Multiplication(表达式求值用栈操作)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1382    Accepted Submission(s): 905 Problem Description Matrix mul

ACM学习历程——UVA442 Matrix Chain Multiplication(栈)

Description Matrix Chain Multiplication  Matrix Chain Multiplication  Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is associative, the order in which multiplications are perfo