乘法运算对于一般的数据都有结合性,比如一般的常数乘法:,这是满足结合律的,而对于特殊数据的乘法,比如矩阵乘法,不同的计算顺序可能会有不同的计算复杂度。所以计算顺序就很重要,这是这个问题提出的背景,而我们要列举出所有的计算顺序也就是给乘法式加括号,比如(A(B(C(DE))))这是其中的一种。
那么我们如何找到所有的加括号的方法呢?下面给出代码:
#include <iostream>
#include <vector>
#include <string>
using namespace::std;
vector<string> resolve(vector<char>& charactor, int s, int e);
int main() {
int n;
cin >> n;
vector<char> charactor;
for (int i = 0; i < 26; i++) {
charactor.push_back('A' + i);
}
vector<string> ans = resolve(charactor,0, n - 1);
for (int i = 0; i < ans.size(); i++){
cout << ans[i] << endl;
}
return 0;
}
vector<string> resolve(vector<char>& charactor, int s, int e) {
if (s == e) {
string to;
to += charactor[s];
vector<string> back;
back.push_back(to);
return back;
} else {
vector<string> ans;
for (int i = s; i < e; i++) {
vector<string> subans1 = resolve(charactor, s, i);
vector<string > subans2 = resolve(charactor, i+1, e);
for (int i = 0; i < subans1.size(); i++) {
for (int j = 0; j < subans2.size(); j++) {
string astr;
astr += '(';
astr += subans1[i];
astr += subans2[j];
astr += ')';
ans.push_back(astr);
}
}
}
return ans;
}
}
结果如下:
5
(A(B(C(DE))))
(A(B((CD)E)))
(A((BC)(DE)))
(A((B(CD))E))
(A(((BC)D)E))
((AB)(C(DE)))
((AB)((CD)E))
((A(BC))(DE))
(((AB)C)(DE))
((A(B(CD)))E)
((A((BC)D))E)
(((AB)(CD))E)
(((A(BC))D)E)
((((AB)C)D)E)
4
(A(B(CD)))
(A((BC)D))
((AB)(CD))
((A(BC))D)
(((AB)C)D)