传送门: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
}
原文:http://www.cnblogs.com/chxer/p/4456794.html