|
发表于 2019-4-16 10:42:58
|
显示全部楼层
本楼为最佳答案
本帖最后由 Croper 于 2019-4-16 18:01 编辑
使用动态规划解决,效率要高得多
- #include <vector>
- #include <unordered_map>
- #include <iostream>
- using namespace std;
- //动态规划
- //从size为1的子集开始,now记录以当前节点结束的新增子集的数目
- //当size增加时,now变为pre,并通过pre推出新的now
- int GetSubArrCount(vector<int> v) {
- vector<int> pre(v.size()+1, 0);
- pre[0] = 1; //当子集的size为0时,只有1个子集,空集
- int sum = 0;
- for (int i = 0; i <= v.size(); ++i) {
- vector<int> now(v.size() - i, 0);
- for (int j = 0; j < pre.size()-1; ++j) { //遍历pre的元素,当元素不为0时,考虑此元素与之后的每一个不重复的元素都能构成新的不重复子集
- if (pre[j] == 0) continue;
- unordered_map<int, bool> map;
- for (int k = 0; k < pre.size()-1 - j; ++k) {
- int a = v[i + j + k];
- if (map[a] == false) {
- map[a] = true;
- now[j + k] += pre[j];
- sum += pre[j];
- }
- }
- }
- pre = move(now);
- }
- return sum;
- }
- int main() {
- vector<int> v = { 1,3,2,5,3,1,4,2,5};
- int i = GetSubArrCount(v);
- cout << i;
- system("pause");
- }
复制代码 |
评分
-
查看全部评分
|