题目:有一个数列N,和一个数字k,输出该数列的前k个子序列,如果k大于N的所有子序列,输出所有符合要求的序列,序列要求不能是递减序列

比如:

3 5

1 3 2

的前五个序列为

1

3

2

1 3

1 2

没有3 2 因为3 2 为递减的

思路:dfs搜索,保存上一次选择的数和所选的数的下标,当选择下一个数的时候比较和上次所选择数的大小,大于等于的是符合条件的,符合条件的输出

这里有三个剪枝:

1.当选择每个序列第一个数的时候,前面如果有相同的数字,那么该数就不搜索,因为前一个选的数已经把他后面的数包含在内,在搜索是浪费

2.当选择的数不是第一个数的时候,那么你选择的前一个数的下标到该数的下标之间,看有没重复的数,如果重复也不用搜索了

注意:如果某个序列的子序列没找到解,说明比它长的子序列都没解,也不用搜了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num[1001];
int count_ = 0,len,n,p;
bool flag = false;
struct number
{
int num;
int pos;
}path[1001]; bool check(int c,int e)
{
int i;
for(i = c; i < e; i++)
{
if(num[i] == num[e])
return false;
}
return true;
} void dfs(int dep,int pos)
{
if(count_ >= p)
return;
if(dep == len)
{
count_++;
flag = true;
int i;
for(i = 0; i < len-1; i++)
printf("%d ",path[i].num);
printf("%d\n",path[i].num);
return ;
}
int i;
for(i = pos; i < n; i++)
{
if(dep == 0 || (dep != 0 && path[dep-1].num <= num[i]))
{
if(dep == 0 && !check(0,i) )
continue;
if(dep != 0 && !check(path[dep-1].pos+1,i) )
continue;
path[dep].num = num[i];
path[dep].pos = i;
dfs(dep+1,i+1);
}
}
return ;
}
int main()
{
while(scanf("%d%d",&n,&p) != EOF)
{
int i;
for(i = 0; i < n ; i++)
{
scanf("%d",&num[i]);
}
count_ = 0;
for(i = 1; i < n; i++)
{
flag = false;
len = i;
dfs(0,0);
if(!flag || (count_ >= p))
break;
}
printf("\n");
}
return 0;
}

Sequence one(hdu2610dfs+去重)的更多相关文章

  1. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  2. hdu_5286_wyh2000 and sequence(分块)

    题目链接:hdu_5286_wyh2000 and sequence 题意: 给一段长度为N的序列,每次询问l-r(l和r和上一次询问的答案有关)内 不同的数的 出现次数的次方 的和.强制在线 题解: ...

  3. List去重的实现

    List<T> 当T为值类型的时候 去重比较简单,当T为引用类型时,一般根据业务需要,根据T的中几个属性来确定是否重复,从而去重. 查看System.Linq下的Enumerable存在一 ...

  4. python中sorted()和set()去重,排序

    前言 在看一个聊天机器人的神经网络模型训练前准备训练数据,需要对训练材料做处理(转化成张量)需要先提炼词干,然后对词干做去重和排序 words = sorted(list(set(words))) 对 ...

  5. List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...

  6. 算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)

    题: 给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列.例: S = [1, 2, 3, 2, 4] T = [1, 2, 4] 则S的所有包含T的子序列为: [1, 2, 3, 2, 4 ...

  7. Codeforces--633D--Fibonacci-ish (map+去重)(twice)

     Fibonacci-ish Time Limit: 3000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u Su ...

  8. Codeforces--633D--Fibonacci-ish(暴力搜索+去重)(map)

    Fibonacci-ish Time Limit: 3000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u Submi ...

  9. HDU5919 Sequence II(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

随机推荐

  1. UGUI Image控件

    今天一起学习Image控件O(∩_∩)O~ 介绍一下基本的属性 Source:Image:               指定图片源, 图片设置2DSprite(2D and UI)格式Color:   ...

  2. java的wait和notifyAll使用方法

    class Num { private int num; public int getNum() { return num; } public void setNum(int num) { this. ...

  3. Unity 进度条3D制作(3D版)

    昨天我们一起学习了2D进度跳的制作,那么趁着我们脑海中还残存昨日的记忆,今天继续学习另一种方法: 实现思路:当鼠标悬浮Start按钮->实例化物体并显示进度->100/100->进入 ...

  4. js数字验证

    1.JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g, ...

  5. PHP学习笔记十二【数组排序】

    <?php $arr=array(0,5,-1); $temp=0; for($i=0;$i<count($arr)-1;$i++) { for($j=0;$j<count($arr ...

  6. MFC 控件初始化的过程

    之前为了学习MFC下浏览器的用法,参考博文:http://www.cnblogs.com/firefly_liu/archive/2009/05/18/1459514.html,虽然按照作者的方法实现 ...

  7. 深入理解JavaWeb技术内幕之中文编码

    为什么要编码 1.计算机中存储信息的最小单元是1个字节,所能表示的字符范围为0~255个. 2.人类要表示的符号太多,无法用1个字节来完全表示. 常见的编码类型 ASCII码 总共128个,用1个字节 ...

  8. django 使用jquery ajax post数据问题

    django 开启了CSRF功能导致jquery ajax post数据报错 解决方法在post数据里引入csrfmiddlewaretoken: '{{ csrf_token }}'},同时需要在f ...

  9. HTML5 canvas 在线画笔绘图工具(三)

    组装画板(TDrawBuilder) 在这一小节中我们要把工具条和画板组装起来,让他们可以协同进行工作. 画板通过一个命名为TDrawBuilder来进行组装.在详细讲解TDrawBuilder对象之 ...

  10. yii操作数据库(AR)

    模型: 有多少数据表,就建立多少模型 模型其实就是类 我们对数据库进行操作,需要实例化模型类,产生对象 通过对象调用相关的方法,就可以实现数据库的操作   增加记录 [php] $post =newP ...