本题求解多个矩阵相乘所用到的乘法的次数,由于存在括号所以要考虑优先级问题,被括号包起来的矩阵优先级更高,优先做乘法,若没有被括号包起来,则遵从从左到右的顺序。
运算存在优先级问题可以考虑用栈,另外本题中存在矩阵的映射问题,所以用到了unordered_map。
从后往前遍历字符串,若是字母或右括号就将其入栈,若为左括号就将栈中保留的元素出栈进行乘法运算,知道栈顶为右括号。
#include<iostream>
#include<string>
#include<unordered_map>
#include<vector>
#include<stack>
using namespace std;
int getMultipCount(const string& str,unordered_map<char, vector<int>>& um);
int main(){
int n;
while(cin >> n){
int row = 0;
int col = 0;
unordered_map<char, vector<int>> um;
for(int i = 0; i < n; ++i){
cin >> row >> col;
um['A' + i] = {row, col};
}
string str;
cin >> str;
cout << getMultipCount(str, um) << endl;
}
return 0;
}
int getMultipCount(const string& str,unordered_map<char, vector<int>>& um){
stack<char> stk;
int res = 0;
for(int i = str.size() - 1; i >= 0; --i){
if(str[i] != '('){
stk.push(str[i]);
}else{
char val1 = stk.top();
stk.pop();
while(stk.top() != ')'){
char val2 = stk.top();
stk.pop();
res = res + um[val1][0] * um[val1][1] * um[val2][1];
um[val1][1] = um[val2][1];
}
stk.pop();
stk.push(val1);
}
}
return res;
}
京公网安备 11010502036488号