标签:
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; }
标签:
原文地址:http://www.cnblogs.com/Kong-Ruo/p/4501167.html