【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数码问题中效率的关键 以下关于几种判重方法进行比較:编码. ...
随机推荐
- JSONObject和JSONArray的简单使用(json-lib)
一. jar包 commons-lang.jar commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.j ...
- One Way Roads(搜索)
One Way Roads Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit S ...
- 【数学三角恒等变幻】【HDU2552】三足鼎立
Problem Description MCA山中人才辈出,洞悉外界战火纷纷,山中各路豪杰决定出山拯救百姓于水火,曾以题数扫全场的威士忌,曾经高数九十九的天外来客,曾以一剑铸十年的亦纷菲,歃血为盟,盘 ...
- zookeeper 丢失事件/miss event
今天在统计页面上发现有个节点丢失了,经过仔细分析后,发现同一个节点上的二个应用(同时监控zk)其中一个丢失了一个event,检查zk cluster没有发现异常... 通过网络搜寻,出现miss ev ...
- stagefright框架(五)-Video Rendering
AwesomePlayer::onVideoEvent除了透過OMXCodec::read取得解碼後的資料外,還必須將這些資料(mVideoBuffer)傳給video renderer,以便畫到螢幕 ...
- HTML之学习笔记(一)简介
HTML(HyperText Markup Language超文本标记语言),'超文本'指的是页面不仅可以包含文本信息,还可以包含图片,链接等非文本元素.html与js,jq是共同用来进行网站前端开发 ...
- wpf中,一个简单的自定义treeview
首先创建一个自定义控件,在里面定义好treeview的样式,将本来的三角形的图标变为加号的图标,并且添加节点之间的连线. <UserControl x:Class="TreeViewE ...
- 详解AJAX核心 —— XMLHttpRequest 对象 (上)
我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊.新手或者对低层还不是很了解的人可以看看,帮助理解与记忆. XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程 ...
- C#抓取网页内容
学习材料一 <C#抓取网页数据分析> 抓取Web网页数据分析 HttpWebRequest 和 HttpWebResponse 的应用
- struts2 中 Session的使用简介
在Struts2里,如果需要在Action中使用到session,可以使用下面两种方式: 通过ActionContext 类中的方法getSession得到 Action实现org.apache.st ...