紫书例题6-3 (UVa 442)

题目地址:https://vjudge.net/problem/UVA-442

题目大意:汗颜,其实我是直接看紫书的中文题意的,大意就是计算两个矩阵乘法次数,设计线性代数知识,可自己百度矩阵乘法。

思路:栈+模拟,左括号开始入栈,右括号开始计算栈顶两个矩阵的乘法次数然后再将新矩阵的n,m入栈即可。

AC代码:

#include <iostream>
#include <string>
#include <stack>
#include <cstring>

using namespace std;

struct node
{
    int m,n;
}s[30];    //结构体,记录n,m

int main()
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        char ch;
        cin >> ch;
        cin >> s[ch-'A'].m >> s[ch-'A'].n;
    }
    int flag=0;
    int ans=0;
    char ch[50];
    while(cin>>ch)
    {
        ans=0;
        stack <node> q;
        flag=0;
        for(int i=0;i<strlen(ch);i++)
        {
            if(ch[i]!=')'&&ch[i]!='(')   //如果是字母就入栈,并且直接转化成n*m
                q.push(s[ch[i]-'A']);
            else if(ch[i]==')')
            {
                node b=q.top();
                q.pop();
                node a=q.top();
                q.pop();
                if(a.n!=b.m)
                {
                    flag=1;
                    break;
                }
                else
                {
                    ans+=a.m*a.n*b.n;    //累计加和
                    node c;
                    c.m=a.m;
                    c.n=b.n;
                    q.push(c);   //这里可以写出q.push(a.m,b.n)
                }
            }
        }
        if(!flag)
            cout << ans << endl;
        else
            cout << "error" << endl;
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/abszse/p/10323612.html
今日推荐