给你一个长度为n(1<=n<=15)的整数数组 nums ,0<=nums[i]<=100。找出并打印所有该数组中不同的递增子序列的个数sum,递增子序列中至少有两个元素 。
如出现两个整数相等,也可以视作递增序列的一种特殊情况。例如:
n=4,nums = [4,6,7,7]
满足条件的序列:[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]
sum=8
输入格式:
第一行中给出n
第二行为nums元素,空格隔开
输出格式:
一个整数sum
输入样例:
在这里给出一组输入。例如:
4
4 6 7 7
输出样例:
在这里给出相应的输出。例如:
8
思路:用dfs遍历所有情况,然后将符合题目要求的情况计数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define maxN 20
int a[maxN];
int sum = 0; //计数符合题目要求的情况
int N;
set<string> SS;
void dfs(vector<int> V, int num) {
for(int i=num+1; i<N; i++) {
if(a[i] >= V[V.size()-1]) { //判断当前遍历的数是否符合递增,符合则插入数组
V.push_back(a[i]);
string s = ""; //将数组里的所有数转成一个字符串,然后用set判断该情况是否已存在
for(int j=0; j<V.size(); j++) {
s += " ";
s += to_string(V[j]);
}
if(SS.count(s)==0 && V.size()>=2) { //判断当前情况是否已经计数
SS.insert(s);
sum++;
}
dfs(V, i);
V.erase(V.begin()+V.size()-1);
}
}
}
int main() {
cin>>N;
memset(a,0,sizeof(a));
for(int i=0; i<N; i++) {
cin>>a[i];
}
vector<int> V;
for(int i=0; i<N; i++) { //用dfs遍历所有情况
V.clear();
V.push_back(a[i]);
dfs(V,i);
}
cout<<sum<<endl;
return 0;
}