题意 2610 按照长度优先 位置次之 输出所有不递减序列

2611 按照长度优先 大小次之 输出所有不递减序列

题解不写了 来源于http://www.cnblogs.com/wally/archive/2013/05/12/3074356.html

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2610

http://acm.hdu.edu.cn/showproblem.php?pid=2611

很好的两道搜索题,都用到了判重。。。orz....不怎么会,看了大牛的解题报告才理解。。。跪神牛

大牛的hdu 2610思路:题意很简单就是在给定的序列中找到固定个数的递增的子序列,如果子序列的总个数少于要求的个数,那么就把所有的子序列输出即可,注意每组测试用例就为有一空行。

技巧一:重判,这里有两个重判,第一个重判是判断如果搜索的是子序列的第一个元素,那么判断从原始序列开始到当前位置是否已经出现过该元素,若出现过则之前肯定搜索过该元素,则放弃该元素的搜索。第二个重判,当搜索的不是子序列的第一个元素时,则判断子序列的前一个元素对应原始序列的位置,然后从该位置下一个元素开始到到当前搜索的位置之前判断该元素是否出现过,如果出现过,说明该子串出现过重复的,则放弃该元素。这里的两个重判需要好好地想想,很巧妙。
技巧二:剪枝,这里的一个剪枝技巧是做了一个标记位,假如我在搜索长度为3的子串时,发现没有一个符合的,那么就不可能存在长度为4的子串符合条件。如果没有这个剪枝就会超时,看来影响很大的
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 1010
struct Node{
int num,pos;
}path[MAXN]; int num[MAXN];
int n,p,_count,len;
bool flag; bool Judge(int st,int ed){
for(int i=st;i<ed;i++){
if(num[i]==num[ed])return false;
}
return true;
} void dfs(int l,int pos){
if(_count>=p)return ;
if(l==len){
_count++;
flag=true;
for(int i=0;i<l-1;i++){
printf("%d ",path[i].num);
}
printf("%d\n",path[l-1].num);
return ;
}
for(int i=pos;i<n;i++){
if((l!=0&&path[l-1].num<=num[i])||l==0){
if(l!=0&&!Judge(path[l-1].pos+1,i))continue;
if(l==0&&!Judge(0,i))continue;
path[l].num=num[i];
path[l].pos=i;
dfs(l+1,i+1);
}
}
} int main(){
while(~scanf("%d%d",&n,&p)){
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
_count=0;
for(int i=1;i<n;i++){
flag=false;
len=i;
dfs(0,0);
if(_count>=p||(!flag))break;
}
puts("");
}
return 0;
}

hdu 2611题目描述:前一题sequence one 属于一类题,都是dfs,首先排一次序,然后再检查时注意输入时的下标,生成的子串不能够出现下标非递增的,也就是首先子串时递增的,其次下标也是递增的,然后不能有重复的子串出现。

技巧:判重的技巧,这里我们可以一开始设置一个flag=false,第一次的时候该flag的为true,然后用一个pre保留当前位置的数,然后后面在搜相同len的序列时,如果当前的数与pre是一样的,说明先前已经搜过了,直接continue就行了,否则,pre就保留这个数,然后搜len+1的数。。。这里的flag和pre用的是太妙了。。。orz...ym!!!


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 110
struct Node{
int num,pos;
}node[MAXN];
int n,p,len,l,_count;
int path[MAXN]; int cmp(const Node &p,const Node &q){
if(p.num!=q.num)
return p.num<q.num;
return p.pos<q.pos;
} bool dfs(int l,int pos,int repos){
if(l==len){
_count++;
for(int i=0;i<l-1;i++){
printf("%d ",path[i]);
}
printf("%d\n",path[l-1]);
if(_count==p)return true;
return false;
}
int pre;
bool flag=false;//flag和pre的判重妙用,得仔细体会;
for(int i=pos;i<=n;i++){
//由于生成的子串是不能出现下标非递增的。
if(node[i].pos>repos){
if(!flag){flag=true;pre=node[i].num;}//判重
else if(pre==node[i].num)continue;//判重
pre=node[i].num;//不相等的话保留当前的数,然后进入下一个dfs继续搜;
path[l]=node[i].num;
if(dfs(l+1,i+1,node[i].pos))return true;
}
}
return false;
} int main(){
while(~scanf("%d%d",&n,&p)){
for(int i=1;i<=n;i++){
scanf("%d",&node[i].num);
node[i].pos=i;
}
sort(node+1,node+n+1,cmp);
_count=0;
for(int i=1;i<n;i++){
len=i;
if(dfs(0,1,0))break;
}
puts("");
}
return 0;
}

【DFS+小操作判重】【HDU2610+HDU2611】Sequence的更多相关文章

  1. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  2. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  3. UVa 10400 - Game Show Math 游戏中的数学 dfs+判重

    题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...

  4. POJ 2458 DFS+判重

    题意: 思路: 搜+判重 嗯搞定 (听说有好多人用7个for写得-.) //By SiriusRen #include <bitset> #include <cstdio>0 ...

  5. hdu 2610 2611 dfs的判重技巧

    对于全排列枚举的数列的判重技巧 1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass 2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素 ...

  6. HDU2579--Dating with girls(2)--(DFS, 判重)

    Dating with girls(2) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. 【BZOJ】1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(暴力dfs+set判重)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1675 一开始我写了个枚举7个点....... 但是貌似... 写挫了. 然后我就写dfs.. 判重好 ...

  8. hdu-2609 How many---最小表示法模板+set判重

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目大意: 有n个有01组成的字符串,每个字符串都代表一个项链,那么该字符串就是一个环状的结构 ...

  9. 关于八数码问题中的状态判重的三种解决方法(编码、hash、&lt;set&gt;)

    八数码问题搜索有非常多高效方法:如A*算法.双向广搜等 但在搜索过程中都会遇到同一个问题.那就是判重操作(假设反复就剪枝),怎样高效的判重是8数码问题中效率的关键 以下关于几种判重方法进行比較:编码. ...

随机推荐

  1. 【枚举+数学】【HDU1271】整数对 难度:五颗星

    整数对 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. SQL Server2008R2安装失败问题之语言包问题

           今天安装SQL Server2008 的时候出现了,如下的的问题,安装过程在ExcuteStandardTimingsWorkflow时候报错,结束安装.       提示:       ...

  3. Extjs 6 MVC开发模式(二)

    1.Extjs MVC开发模式 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs4.x版本中引入了MVC开发模式,开始将 ...

  4. 使用xib方式创建UITableViewCell,设置Label自动换行注意事项

    自定义的UITableViewCell,使用xib方式创建,想要其中的UILabel换行显示:计算Label的高度,让其自动换行,总是没有效果. 我猜测原因可能在于使用了autolayout布局.只要 ...

  5. 查看DB文件的空间使用情况

    可以使用如下语句获得DB文件的空间使用 use dbName SELECT DB_NAME() AS DbName, name AS FileName, size/128.0 AS CurrentSi ...

  6. HDU 5805 - NanoApe Loves Sequence (BestCoder Round #86)

    先找相邻差值的最大,第二大,第三大 删去端点会减少一个值, 删去其余点会减少两个值,新增一个值,所以新增和现存的最大的值比较一下取最大即可 #include <iostream> #inc ...

  7. eclipse优化配置

    -startup plugins/org.eclipse.equinox.launcher_1..jar --launcher.library plugins/org.eclipse.equinox. ...

  8. C语言--流程控制

    一.流程控制 1.顺序结构 *默认的流程结构,按照书写顺序执行每一条语句 2.选择结构 *对给定的条件进行判断,再根据判断结果来决定执行那一段代码 3.循环结构 *在给定条件成立的情况下,反复执行某一 ...

  9. Linux文件解压缩详解

    tar命令 我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名, ...

  10. :gAudit

    http://www.doc88.com/p-0794369847693.html http://baike.baidu.com/link?url=pcOUfBpILuEAPFrBSsSU-6Vzg3 ...