问题描述 :
给定一个整型数组, 你的任务是找到所有该数组的递增子序列并输出其数量,递增子序列的长度至少是2。
示例:
输入: [4, 6, 7, 7]
输出: 8
解释:递增子序列包括:[[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]],共8个
说明:
给定数组的长度不会超过15。
数组中的整数范围是 [-100,100]。
给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
输入说明 :
首先输入数组元素数目n,然后输入n个整数
输出说明 :
输出一个整数
输入范例 :
4
4 6 7 7
输出范例 :
8
#include<iostream>
#include<vector>
#include<set>
using namespace std;
void dfs(vector<int>& nums,int i,set<vector<int>> &res,vector<int> &tmp){
if(tmp.size()>=2){
res.insert(tmp);
}
for(int j=i;j<nums.size();j++){
if(!tmp.empty()&&tmp.back()>nums[j]) continue;
tmp.push_back(nums[j]);
dfs(nums,j+1,res,tmp);
tmp.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
set<vector<int>> res;//利用set去重
vector<int> tmp;
dfs(nums,0,res,tmp);
return vector<vector<int>> (res.begin(),res.end());
}
int main(){
int n,tmp;
vector<int> nums;
cin>>n;
for(int i=0;i<n;i++){
cin>>tmp;
nums.push_back(tmp);
}
vector<vector<int>> res=findSubsequences(nums);
cout<<res.size();
return 0;
}