题目大意:
给出一个矩阵乘法的表达式,计算需要多少次乘法运算。
思路:学过线性代数就很容易得出乘法次数就是A(row)*B(row)*B(col),也就是A的行数乘以A的行数和列数,思路本质上和表达式求值的题目是一样的,用一个栈保存矩阵信息,遇到右括号时从栈中弹出两矩阵参与运算。并将计算结果入栈。
具体实现:
(PS:这里的矩阵只存储了它的行数和列数,由于想不不到合适的名字,只好用它代替)
#include<iostream> #include<map> #include<cstring> #include<stack> using namespace std; struct Matrix{int row; int col;}; stack<Matrix> s; map<char,Matrix> Matrix_info; char Matrixexp[10000]; //ma mb分别表示两个矩阵 sum是计算次数 bool multiCount(const Matrix& Ma,const Matrix& Mb,int& count){ //如果不能计算 if(Ma.col!=Mb.row){ return false; }else{ count+=Ma.row*Mb.col*Mb.row; Matrix newMatrix={Ma.row,Mb.col}; //将运算后的矩阵放入栈中 s.push(newMatrix); return true; } } void solution() { int count=0; bool isLegal=true; for(int i=0;i<strlen(Matrixexp);i++){ if(Matrixexp[i]>='A'&&Matrixexp[i]<='Z'){ s.push(Matrix_info[Matrixexp[i]]); }else if(Matrixexp[i]==')'&&s.size()>=2){ Matrix ma,mb; mb=s.top(); s.pop(); ma=s.top(); s.pop(); isLegal=multiCount(ma,mb,count); if(!isLegal) break; } } if(isLegal) cout<<count<<endl; else cout<<"error"<<endl; } void input(){ int n; cin>>n; while(n--){ char Matrix_name; Matrix Matrix_size; cin>>Matrix_name>>Matrix_size.row>>Matrix_size.col; Matrix_info[Matrix_name]=Matrix_size; } } int main() { input(); cin.get(); while(gets(Matrixexp)){ solution(); } return 0; }