acm_Sequence one

题目:

Problem Description
Search is important in the acm algorithm. When you want to solve a problem by using the search method, try to cut is very important.<br>Now give you a number sequence, include n (&lt;=1000) integers, each integer not bigger than 2^31, you want to find the first P subsequences that is not decrease (if total subsequence W is smaller than P, than just give the first W subsequences). The order of subsequences is that: first order the length of the subsequence. Second order the sequence of each integer’s position in the initial sequence. For example initial sequence 1 3 2 the total legal subsequences is 5. According to order is {1}; {3}; {2}; {1,3}; {1,2}. {1,3} is first than {1,2} because the sequence of each integer’s position in the initial sequence are {1,2} and {1,3}. {1,2} is smaller than {1,3}. If you also can not understand , please see the sample carefully. <br>
 

Input
The input contains multiple test cases.<br>Each test case include, first two integers n, P. (1<n<=1000, 1<p<=10000). <br>
 

Output
For each test case output the sequences according to the problem description. And at the end of each case follow a empty line.
 

Sample Input
  
  
3 5<br>1 3 2<br>3 6<br>1 3 2<br>4 100<br>1 2 3 2<br>
 

Sample Output
  
  
1<br>3<br>2<br>1 3<br>1 2<br><br>1<br>3<br>2<br>1 3<br>1 2<br><br>1<br>2<br>3<br>1 2<br>1 3<br>2 3<br>2 2<br>1 2 3<br>1 2 2<br><br><br><div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Hint : You must make sure each subsequence in the subsequences is unique.</div>
 

题意:给你N个数,基本上有点求它的子集的感觉,因为他不能重复。。


想法:深搜加剪枝即可。。


代码:

#include<iostream>  
#include<cstring>  
using namespace std;  
int d[1009];  
int n,p;
int l,c;
struct name  
{  
    int now,pos;
};  
name w[10009];  
bool flag;
bool check(int s,int e)  
{  
    for(int i=s+1;i<e;i++)  
    {  
        if(d[i]==d[e])  
        return false;  
    }  
    return true;  
}  
void set(int length)  
{  
    for(int i=0;i<length-1;i++)  
    cout<<w[i].now<<" ";  
    cout<<w[length-1].now<<endl;
}  
void dfs(int dep,int pos)  
{  
    if(c>=p)
    return;  
    if(dep==l)
    {  
        c++;
        flag=true;  
        set(l);  
        return;  
    }
    for(int i=pos;i<n;i++)  
    {
        if((dep!=0&&w[dep-1].now<=d[i])||dep==0)  
        { 
            if(dep==0&&!check(-1,i))
                continue;  
            if(dep!=0&&!check(w[dep-1].pos,i))  
                continue;  
            w[dep].now=d[i];  
            w[dep].pos=i;  
            dfs(dep+1,i+1);  
        }  
    }  
    return;  
}  
int main()  
{  
    int i;
    while(cin>>n>>p)  
    {  
        for(i=0;i<n;i++)  
        cin>>d[i];  
        c=0;  
        for(i=1;i<n;i++)  
        {  
            flag=false;  
            l=i;  
            dfs(0,0);  
            if(c>=p||!flag)  
            break;  
        }  
        cout<<endl;  
    }  
    return 0;  
}


感想:好难。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值