首页 > 其他 > 详细

POJ 0016 20603矩阵链乘

时间:2015-04-25 22:39:05      阅读:643      评论:0      收藏:0      [点我收藏+]

传送门: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(‘\n‘);
37         M[id].b=read();
38         //write(M[id].b); putchar(‘\n‘);
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 

}

POJ 0016 20603矩阵链乘

原文:http://www.cnblogs.com/chxer/p/4456794.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!