题目链接:https://vjudge.net/problem/UVA-442
题目大意:输入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
分析:本题的关键是解析表达式,本题的表达式比较简单,可以用一个栈来完成,遇到字母时入栈,遇到右括号时出栈并计算,然后结果入栈。 因为保证输入合法,括号无需入栈
#include<iostream> #include<stack> #include<algorithm> using namespace std; typedef long long ll; const int maxn=26+5; struct Matrix { int a,b; //Matrix (int a=0,int b=0):a(a),b(b){} Matrix (int c=0,int d=0) { a=c; b=d; } }m[maxn]; stack<Matrix> s; int main() { int n; cin>>n; for(int i=0;i<n;i++) { string name; cin>>name; int k=name[0]-'A';//存下标 cin>>m[k].a>>m[k].b; } string expr; while(cin>>expr) { int len=expr.length(); bool error=false; int ans=0; for(int i=0;i<len;i++) { if(isalpha(expr[i])) s.push(m[expr[i]-'A']);//是否是字母 也就是矩阵 是的话入栈 else if(expr[i]==')') { Matrix m2=s.top(); s.pop();//取两个字符 Matrix m1=s.top(); s.pop(); if(m1.b!=m2.a) { error=true; break; } ans+=m1.a*m1.b*m2.b; s.push(Matrix(m1.a,m2.b)); } } if(error) cout<<"error"<<endl; else cout<<ans<<endl; } return 0; }