使用递归打印所有递增子序列
printing all increasing subsequence using recursion
我正在尝试打印所有递增的子序列。 但它并没有相应地起作用。
请解释一下我的代码实际上做了什么。
自上周以来,我被困住了。 但想不通。
#include <bits/stdc++.h>
using namespace std;
int temp[1000];
int ans = 1;
int cnt = 0;
void solve(int *arr, int n, int k)
{
if(k == n){
cnt++;
for(int j = 0; j < n; j++){
cout<<temp[j]<<" ";
}
cout<<endl;
return;
}
for(int i = k; i < n; ++i){
if(arr[k] <= arr[i]){
temp[k] = -2;
solve(arr, n, i+1);
temp[k] = 2;
}
}
}
int main()
{
int arr[] = {4, 1, 13, 7, 0, 2, 8, 11, 3};
//int arr[] = {-1, 1 ,2, 3, 4};
//int arr[] = {-1,1,2,3,4,11, 5,6, 2, 9};
memset(temp, -1, sizeof(temp));
solve(arr, 9, 0);
cout<<cnt<<endl;
return 0;
}
输出应该是枚举递增子序列的总数。
这将打印所有递增的子序列:
void print(const vector<int> v) {
for (size_t i = 0; i < v.size() - 1; ++i)
cout << v[i] << ", ";
cout << v.back() << endl;
}
int solve(const vector<int>& v, size_t start, vector<int>& sequence) {
print(sequence);
int count = 1;
for (size_t i = start; i < v.size(); ++i) {
if (v[i] >= sequence.back()) {
sequence.push_back(v[i]);
count += solve(v, i + 1, sequence);
sequence.pop_back();
}
}
return count;
}
size_t solve(const vector<int>& v) {
int count = 0;
for (size_t i = 0; i < v.size(); ++i) {
vector<int> sequence{v[i]};
count += solve(v, i + 1, sequence);
}
return count;
}
用法:
vector<int> v{4, 1, 13, 7, 0, 2, 8, 11, 3};
auto count = solve(v);
cout << "Count: " << count << endl;
输出:
4
4, 13
4, 7
4, 7, 8
4, 7, 8, 11
4, 7, 11
4, 8
4, 8, 11
4, 11
1
1, 13
1, 7
1, 7, 8
1, 7, 8, 11
1, 7, 11
1, 2
1, 2, 8
1, 2, 8, 11
1, 2, 11
1, 2, 3
1, 8
1, 8, 11
1, 11
1, 3
13
7
7, 8
7, 8, 11
7, 11
0
0, 2
0, 2, 8
0, 2, 8, 11
0, 2, 11
0, 2, 3
0, 8
0, 8, 11
0, 11
0, 3
2
2, 8
2, 8, 11
2, 11
2, 3
8
8, 11
11
3
Count: 48
相关文章:
- 如何使用递归打印修改后的星号三角形图案
- 使用递归 c++ 打印模式
- 使用类进行实现时,递归打印C++中的链表
- 如何使用递归打印最长公共子序列中涉及的字符串?
- 使用递归打印所有递增子序列
- 二叉搜索树按级别递归C++打印节点
- 使用递归打印输出
- 如何使用递归打印文本反驳
- 使用while和if递归打印字符
- 将数组传递到空隙函数,然后递归打印元素
- 在 C++ 中使用递归打印斐波那契级数
- 如何使用字符串流C++递归打印出二进制搜索树中的所有节点
- IntStack的C++递归打印函数
- 使用C++第2部分递归打印LinkedList
- 使用C++递归打印LinkedList
- C++如何递归打印阶乘程序的输出
- 如何使用类链表进行递归打印
- 使用斐波那契递归打印 1 到 n
- 使用单个参数递归打印菱形
- 使用递归C++打印等边三角形A-Z