传送门: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 }