• COJ 0016 20603矩阵链乘


    传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454

    20603矩阵链乘
    难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述

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

     此题数据有误,2015-4-25已修正。

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

    输入示例
    3
    A 50 10
    B 10 20
    C 20 5
    A(BC)
    输出示例
    3500
    其他说明
    数据范围:表达式的长度不超过100个字符。所有数据运算不会超过int32范围。

    栈处理简单表达式。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<stack>
     7 using namespace std;
     8 const int maxn=100+10;
     9 int n;
    10 struct Matrix{
    11     int a,b;
    12 }M[maxn];
    13 inline int read(){
    14     int x=0,sig=1;char ch=getchar();
    15     while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();}
    16     while(isdigit(ch)) x=10*x+ch-'0',ch=getchar();
    17     return x*=sig;
    18 }
    19 inline void write(int x){
    20     if(x==0){putchar('0');return;} if(x<0) putchar('-'),x=-x;
    21     int len=0,buf[15]; while(x) buf[len++]=x%10,x/=10;
    22     for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;
    23 }
    24 int solve(Matrix& a,Matrix b){
    25     int ans=-1;
    26     if(a.b==b.a){ans=a.a*b.b*b.a;a.b=b.b;}
    27     return ans;
    28 }
    29 void init(){
    30     n=read();
    31     char ch;
    32     for(int i=1;i<=n;i++){
    33         do ch=getchar(); while(isalpha(ch)!=1);
    34         int id=ch-'A';
    35         M[id].a=read();
    36         //write(M[id].a); putchar('
    ');
    37         M[id].b=read();
    38         //write(M[id].b); putchar('
    ');
    39     }
    40     return;
    41 }
    42 stack<Matrix> S;
    43 void work(){
    44     int ans=0;
    45     char s[maxn];scanf("%s",s);
    46     int len=strlen(s);
    47     for(int i=0;i<len;i++){
    48         if(isalpha(s[i])) S.push(M[s[i]-'A']);
    49         else if(s[i]==')'){
    50             Matrix t2=S.top();S.pop();
    51             Matrix t1=S.top();S.pop();
    52             int t=solve(t1,t2);
    53             if(t<0){puts("error");return;}
    54             ans+=t;S.push(t1);
    55         }
    56     }
    57     Matrix t2=S.top();S.pop();
    58     Matrix t1=S.top();S.pop();
    59     int t=solve(t1,t2);
    60     if(t<0){puts("error");return;}
    61     ans+=t;
    62     write(ans);
    63     return;
    64 }
    65 void print(){
    66     return;
    67 }
    68 int main(){
    69     init();work();print();return 0;
    70 
    71 
    72 }
  • 相关阅读:
    前端与后端的一些论述
    Pandas Cheat Sheet
    flask+socketio+echarts3 服务器监控程序(基于后端数据推送)
    【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
    【Java并发编程实战】-----“J.U.C”:锁,lock
    【Java并发编程实战】-----synchronized
    【java并发编程实战】-----线程基本概念
    2015年读书系统
    阮一峰文集:《一个寻找作者的读者》
    进一步封装highchart,打造自己的图表插件:jHighChart.js
  • 原文地址:https://www.cnblogs.com/chxer/p/4456794.html
Copyright © 2020-2023  润新知