想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n个矩阵,给出这些矩阵的行和列,并标记矩阵为大写字母A-Z,所以矩阵最多有26个,然后给出一个表达式,
比如(AB)就是A矩阵乘B矩阵,问一个表达式中,一共要计算多少次乘法,如果不能计算则输出error
解题思路:
首先根据矩阵基本定理:如果矩阵AB相乘,那么A矩阵的列要等于B矩阵的行,否则就不能相乘,那么AB矩阵相乘的乘法次数我们也可以算出来,等于A.row*A.col*B.col
根据这个,我们计算一个表达式,遇到(不处理,遇到A-Z则进栈,遇到)则计算栈顶两个矩阵的乘法,再将两个相乘后的矩阵进栈
/*
Memory 256K
Time 16MS
*/
#include <iostream>
#include <stack>
#include <string>
using namespace std;
class CMaxtrix{
public:
int row,col; //行、列
};
class CJob{
private:
CMaxtrix *m_maxtrix;
public:
void AddMaxtrix(int i,int row,int col);
CJob();
~CJob();
int Run(string str);
};
CJob::CJob(){
m_maxtrix = new CMaxtrix[26];
}
CJob::~CJob(){
delete m_maxtrix;
}
void CJob::AddMaxtrix(int i,int row,int col){
m_maxtrix[i].row = row;
m_maxtrix[i].col = col;
}
int CJob::Run(string str){
stack <CMaxtrix>s;
int i;
int ans = 0;
for(i = 0;i < str.length();i++){
if(str[i]<='Z' && str[i]>='A'){ //遇到A-Z进栈
s.push(m_maxtrix[str[i] - 'A']);
}else{
if(str[i] == ')'){ //遇到)计算栈顶两个矩阵的乘法
CMaxtrix One = s.top();
s.pop();
CMaxtrix Tow = s.top();
s.pop();
if(One.row == Tow.col){
ans += Tow.col*Tow.row*One.col; //乘法次数
Tow.col = One.col;
s.push(Tow); //两矩阵相乘后进栈
}else{ //如果不能计算返回erroe
return -1;
}
}
}
}
return ans;
}
int main(){
int n,a,b,ans;
string str;
char ch[10];
CJob job;
cin>>n;
while(n--){
cin>>ch>>a>>b;
job.AddMaxtrix(ch[0] - 'A',a,b);
}
while(cin>>str){
ans = job.Run(str);
if(ans == -1) cout<<"error"<<endl;
else cout<<ans<<endl;
}
return 0;
}