版权声明:欢迎转载,但请标注来源 https://blog.csdn.net/qq_42686721/article/details/83245024
题目大意
题目链接:走你
给出每个矩阵的尺寸,再给出一些矩阵相乘的表达式,求每个表达式需要的运算次数。
题解
一道还算简单的模拟题,需要知道矩阵相乘的一些性质
- 两个矩阵要是能做乘法,要求前面的矩阵的列数要等与后面矩阵的行数
- 矩阵乘法的复杂度(计算次数)为 ,其中,m为第一个矩阵的行,k为矩阵一的列或矩阵二的行,n为矩阵二的列
然后用栈模拟表达式顺序即可 (和某道括号匹配很相似),而且貌似一个括号里最多两个矩阵,所以就很简单了
注意,stack弹出时的矩阵顺序……
code
#include <iostream>
#include <stack>
#include <map>
#include <cstring>
using namespace std;
struct mat_ {
int r, c; ///行, 列
};
map <char, mat_> mat;
char c;
string s;
int n;
int main () {
cin >> n;
for (int i = 0;i < n; ++ i) {
cin >> c;
cin >> mat[c].r >> mat[c].c;
}
while (cin >> s) {
stack <mat_> sta;
int ans = 0;
bool is_bk = 0;
for (int i = 0;i < s.size (); ++ i) {
if (s[i] == '(') continue;
if (s[i] == ')') {
mat_ sed = sta.top(); sta.pop();
mat_ fst = sta.top(); sta.pop(); ///这里千万别搞反
if (fst.c != sed.r) {
cout << "error" << endl;
is_bk = 1;
break;
}
ans += fst.r * fst.c * sed.c;
fst.c = sed.c;
sta.push (fst);
}
else {
sta.push(mat[s[i]]);
}
}
if (!is_bk) {
cout << ans <<endl;
}
}
return 0;
}