【DFS+小操作判重】【HDU2610+HDU2611】Sequence
题意 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思路:题意很简单就是在给定的序列中找到固定个数的递增的子序列,如果子序列的总个数少于要求的个数,那么就把所有的子序列输出即可,注意每组测试用例就为有一空行。
#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的更多相关文章
- 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 ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...
- POJ 2458 DFS+判重
题意: 思路: 搜+判重 嗯搞定 (听说有好多人用7个for写得-.) //By SiriusRen #include <bitset> #include <cstdio>0 ...
- hdu 2610 2611 dfs的判重技巧
对于全排列枚举的数列的判重技巧 1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass 2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素 ...
- HDU2579--Dating with girls(2)--(DFS, 判重)
Dating with girls(2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 【BZOJ】1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(暴力dfs+set判重)
http://www.lydsy.com/JudgeOnline/problem.php?id=1675 一开始我写了个枚举7个点....... 但是貌似... 写挫了. 然后我就写dfs.. 判重好 ...
- hdu-2609 How many---最小表示法模板+set判重
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目大意: 有n个有01组成的字符串,每个字符串都代表一个项链,那么该字符串就是一个环状的结构 ...
- 关于八数码问题中的状态判重的三种解决方法(编码、hash、<set>)
八数码问题搜索有非常多高效方法:如A*算法.双向广搜等 但在搜索过程中都会遇到同一个问题.那就是判重操作(假设反复就剪枝),怎样高效的判重是8数码问题中效率的关键 以下关于几种判重方法进行比較:编码. ...
随机推荐
- linux虚拟主机管理系统wdcp系列教程之三
我们安装了网站服务管理系统wdcp之后,在使用过程中可能会出现这样或那样的疑问,下面给大家整理几点出来,方便大家学习.还有不懂的可以到wdlinux论坛寻找相关教程. 1.wdcp后台访问安全设置即限 ...
- socketpair的使用
socketpair函数概要例如以下:#include <sys/types.h>#include <sys/socket.h>int socketpair(int domai ...
- SSCTF Final PWN
比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...
- ubuntu WiFi: operation not possible due to RF-kill《转载》
Some people have been experiencing WiFi problems with Ubuntu 10.10 since an update that happend just ...
- Windows下安装Memcache
安装步骤的时候只需要做两步: 第一步:安装memcache.exe 服务. 第二步:安装php_memcache.dll扩展,让php支持memcache. 1.安装 memcache.exe 服务 ...
- 结构体 + typedef
简单结构体 struct student{ char name[20]; //可以用scanf或者直接赋值 *如果用char *name 在用scanf时没有内存接收 long id; int ...
- WEB标准:标准定义、好处、名词解释、常用术语、命名习惯、浏览器兼容、代码书写规范
1. WEB标准是什么? “WEB标准”是一系列标准的总称.一般的误区经常把WEB标准说成DIV+CSS.准确的说法应该是:采用W3C推荐的WEB标准中的XHTML1.1结合CSS2.0 样式表制作页 ...
- vector 汇总
Vector成员函数 函数 表述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) ...
- Sicily 1790. Single Round Match
高进度求余 或者 将一个数奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11整除. #include <iostream> ...
- activiti 部署在oracle多用户下不能自动建表问题的解决!
在activiti配置文件中的SpringProcessEngineConfiguration的配置项中添加<property name= "databaseSchema" ...