uva442-矩阵链乘 题解
题干
假设你必须评估一种表达形如 ABCDE,其中 A,B,C,D,E是矩阵。既然矩阵乘法是关联的,那么乘法的顺序是任意的。然而,链乘的元素数量必须由你选择的赋值顺序决定。
例如,A,B,C分别是 50 * 10 ,10 * 20 和 20 * 5 的矩阵。现在有两种方案计算 A * B * C ,即(A * B) * C 和 A*(B * C)。
第一个要进行15000次基本乘法,而第二个只进行3500次。
你的任务就是写出一个程序判定以给定的方式相乘需要多少次基本乘法计算。
输入包含两个部分:矩阵和表达式。 输入文件的第一行包含了一个整数 n(1 ≤ n ≤ 26), 代表矩阵的个数。接下来的n行每一行都包含了一个大写字母,说明矩阵的名称,以及两个整数,说明行与列的个数。
第二个部分严格遵守以下的语法:

思路
其实就是表达式求值,由于矩阵具有长和宽两个元素,所以我们定义一个结构体来表示矩阵。然后定义一个元素是矩阵的栈,通过给定表达式来操作栈。我们遇到'('不管,遇到矩阵直接入栈,遇到')'吐出两个矩阵进行运算,如果不能运算直接return -1,否则计算本次运算的乘积次数,然后累加。最后直接输出总的乘积次数即可
知识清单
1.结构体的构造法
a.默认构造Matrix(){v=0;h=0;}
b.参数化构造Matrix(int a,int b){v=a;h=b;}
初始化列表Matrix(int a,int b):v(a),h(b){}
值得注意的是,当使用参数构造的时候,想直接Matrix arr是不行的,得Matrix arr(1,2),若想直接声明,必须加上默认构造Matrix():v(0),h(0){}
2.
isalpha属于 cctype头文件,但是你会发现不加这个头文件甚至不加string都能运行,其实是iostream隐式引入了
代码
#include<iostream>
#include<string>
#include<cctype>
#include<stack>
using namespace std;
typedef struct Matrix{
int vertical;
int horizontal;
Matrix():vertical(0),horizontal(0){}
Matrix(int v,int h):vertical(v),horizontal(h){}
}matrix;
matrix arr[26];
int getnum(string a);
int main(){
int n;
cin>>n;
while(n--){
char name;
cin>>name;
cin>>arr[name-'A'].vertical;
cin>>arr[name-'A'].horizontal;
}
string equation;
getchar();
while(getline(cin,equation)){
int num=getnum(equation);
if(num==-1) cout<<"error"<<endl;
else cout<<num<<endl;
}
}
int getnum(string a){
if(!(a.length()-1))return 0;
else{
int cnt=0;
stack <matrix> m;
for(int i=0;i<a.length();i++){
char alpha=a.at(i);
if(isalpha(alpha))m.push(arr[alpha-'A']);
else if(alpha==')'){
matrix temp_1=m.top();
m.pop();
matrix temp_2=m.top();
m.pop();
if(temp_1.vertical!=temp_2.horizontal)return -1;
else {cnt+=temp_1.vertical*temp_1.horizontal*temp_2.vertical;
matrix temp_3(temp_2.vertical,temp_1.horizontal);
m.push(temp_3);
}
}
}
return cnt;
}
}

浙公网安备 33010602011771号