#include <iostream>
#include <algorithm>
#include <cstring>
const int M = 1100;
using namespace std;
struct Node{
int num;
int pos;
}num[M];
int n,p,res[M],len;
bool flag=false;
bool cmp(Node a,Node b)
{
if(a.num==b.num)
{
return a.pos<b.pos;
}
return a.num<b.num;
}
int dfs(int pos,int cur,int pr) //pr 前面选的一个数的位置
{
if(!p) return 1;
if(cur==len)
{
p--;
for(int i=0;i<len-1;i++)
{
cout<<res[i]<<' ';
}
cout<<res[len-1]<<endl;
if(p) return 0;
return 1;
}
int pre;
bool flag=false;
for(int i=pos;i<n;i++)
{
if(num[i].pos>pr) //subsequnce的下标要递增
{
if(!flag)
{
flag=true;
pre=num[i].num;
}
else //example
{ // 1 4 5 5 8 11 20
// 1 4 5 .. cur=3 pos=4时 以5为第三位的所有情况在pos=3时已经搜索一遍了 所以 pos=4 的情况可以cut
if(pre==num[i].num) //因为已经母串排好序了 只要看 pre和当前是否相等就可以 cut 和2610 cut2一样的
continue;
// -> 搜到长度为cur时 若num[cur]==pre 则cut 因为num[cur]的情况在pre的时候就已经搜索过一次咯
}
pre=num[i].num;
res[cur]=num[i].num;
if(dfs(i+1,cur+1,num[i].pos))
return 1;
}
}
return 0;
}
int main()
{
int i;
while(cin>>n>>p)
{
for(i=0;i<n;i++)
{
cin>>num[i].num;
num[i].pos=i;
}
sort(num,num+n,cmp); //取得时候 ,子序列的值递增
for(int k=1;k<n;k++) // sub 长度为k
{
len=k;
if(dfs(0,0,-1)) // !dfs 说明不存在 长度递增为k的sub k以上自然不存在
{
break;
}
}
cout<<endl;
}
return 0;
}
hdu 2611 dfs+经典判重cut
最新推荐文章于 2018-04-20 21:33:23 发布