码迷,mamicode.com
首页 > 其他好文 > 详细

崆若的水题之--矩阵乘法(SSDFOJ0016)

时间:2015-05-13 19:30:53      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=16

输入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.

输入

第一行包括一个正整数n,表示共有n个矩阵参与运算。
接下来的n行,每行包括三部分,第一部分是矩阵的名字(一个大写字母),第二部分和第三部分各是一个正整数,分别表示该矩阵的行数和列数,这三部分之间有一个空格分隔。
最后一行包括一个矩阵运算的合法字符串(只包括小括号和上述矩阵的名称)

输出

按题目描述中的要求输出

输入示例

3
A 50 10
B 10 20
C 20 5
A(BC)

输出示例

3500

技术分享
#include<iostream>
#include<stack>
using namespace std;
const int maxn=100+10;
int n;
struct Matrix
{
    int a,b;
}M[maxn];
inline int read()
{
    int x=0,sig=1;char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch==-) sig=-1;
        ch=getchar();
    }
    while(isdigit(ch)) x=10*x+ch-0,ch=getchar();
    return x*=sig;
}
inline void write(int x)
{
    if(x==0)
    {
        putchar(0);
        return;
    } 
    if(x<0) putchar(-),x=-x;
    int len=0,buf[15]; while(x) buf[len++]=x%10,x/=10;
    for(int i=len-1;i>=0;i--) putchar(buf[i]+0);
    return;
}
int solve(Matrix& a,Matrix b)
{
    int ans=-1;
    if(a.b==b.a)
    {
        ans=a.a*b.b*b.a;
        a.b=b.b;
    }
    return ans;
}
void init()
{
    n=read();
    char ch;
    for(int i=1;i<=n;i++)
    {
        do ch=getchar(); 
        while(isalpha(ch)!=1);
        int id=ch-A;
        M[id].a=read();
        M[id].b=read();
    }
    return;
}
stack<Matrix> S;
void work()
{
    int ans=0;
    char s[maxn];scanf("%s",s);
    int len=strlen(s);
    for(int i=0;i<len;i++)
    {
        if(isalpha(s[i])) S.push(M[s[i]-A]);
        else if(s[i]==))
        {
            Matrix t2=S.top();
            S.pop();
            Matrix t1=S.top();
            S.pop();
            int t=solve(t1,t2);
            if(t<0)
            {
                puts("error");
                return;
            }
            ans+=t;S.push(t1);
        }
    }
    Matrix t2=S.top();
    S.pop();
    Matrix t1=S.top();
    S.pop();
    int t=solve(t1,t2);
    if(t<0)
    {
        puts("error");
        return;
    }
    ans+=t;
    write(ans);
    return;
}
int main()
{
    init();
    work();
    return 0;
}
萌萌哒代码~~

 

崆若的水题之--矩阵乘法(SSDFOJ0016)

标签:

原文地址:http://www.cnblogs.com/Kong-Ruo/p/4501167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!