hdu 2610 2611 dfs的判重技巧
对于全排列枚举的数列的判重技巧
1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass
2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素对应原序列的位置一直到查到到元素的位置看是否出现过。,。 出现过就pass
2610
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std; //len:搜索的长度,count:记录有多少个串了
int n,p,len,count_num;
int num[]; //做一个标记,如果一个短的串都不能够找到,
//那么就长的串就更不可能找到了,这里的一个巧妙地剪枝如果没用就会超时
bool flag; typedef struct
{
int n,pos;
}Tem; Tem tem[]; //若在产生序列的前一个数字到当前这个数字中,
//出现等于num[e]的,那么说明之前已经有序列选择了num[e],
bool check(int s,int e)
{
for(int i = s+; i < e; i++)
if(num[i]==num[e])return false;
return true;
} void print_sequence(int length)
{
for(int i =; i < length-;i++)
cout<<tem[i].n<<" ";
cout<<tem[length-].n<<endl;
} //dep:搜索的深度,也就是目前搜索到子串的长度
//pos: 当前搜索的位置
void dfs(int dep,int pos)
{
if(count_num >= p)return;
//搜索到了
if(dep==len)
{
count_num++;
flag = true;
print_sequence(len);
//已经搜索到符合的字串了
return;
}
for(int i=pos;i<n;i++)
{
if((dep!=&&tem[dep-].n<=num[i])||dep==)
{
if(dep==&&!check(-,i))//当是第一个元素的时候
continue;
if(dep!=&&!check(tem[dep-].pos,i))//不是第一个元素的时候
continue;
tem[dep].n = num[i];
tem[dep].pos = i;
dfs(dep+,i+);
}
}
return;
} int main()
{
while(cin>>n>>p)
{
for(int i=;i<n;i++)
cin>>num[i];
count_num =;
for(int i =;i < n;i++)
{
flag=false;
len = i;
dfs(,);
if(count_num>=p||!flag)break;
}
cout<<endl;
}
return;
}
2611
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 101
using namespace std;
struct node
{
int data,pos;
}fuck[maxn];
int n,m,cnt,len,liner[maxn];
int cmp(node a,node b)
{
if(a.data==b.data) return a.pos<b.pos;
else return a.data<b.data;
}
void dfs(int dep,int pos,int prelpos)
{
if(cnt>m) return;
if(dep==len)
{
cnt++;
if(cnt>m) return;
for(int i=;i<dep;i++)
{
if(i==) cout<<liner[i];
else cout<<' '<<liner[i];
}
cout<<endl;
return ;
}
int pre,f=;//对一层内的数的判重 pre 用来记录前一次出现的数(每次都要更新,, 这里错了一次)
for(int i=pos;i<=n;i++)
{
if(fuck[i].pos>prelpos)
{
if(f==)//先初始化f为0 第一次的时候用来记录
{
f=-;
pre=fuck[i].data;
}
else if(pre==fuck[i].data) continue;//应为是排好序的 所以 同层里面 用过的就直接 continue
pre=fuck[i].data;
liner[dep]=fuck[i].data;
dfs(dep+,i+,fuck[i].pos);
if(cnt>m) return;
}
}
}
int main()
{
while(cin>>n>>m)
{
for(int i=;i<=n;i++)
{
cin>>fuck[i].data;
fuck[i].pos=i;
}
cnt=;
sort(fuck+,fuck++n,cmp);
for(int i=;i<n;i++)
{
len=i;
dfs(,,);
if(cnt>m) break; }
cout<<endl;
}
return;
}
hdu 2610 2611 dfs的判重技巧的更多相关文章
- POJ 3050 枚举+dfs+set判重
思路: 枚举+搜一下+判个重 ==AC //By SiriusRen #include <set> #include <cstdio> using namespace std; ...
- 【BZOJ】1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(暴力dfs+set判重)
http://www.lydsy.com/JudgeOnline/problem.php?id=1675 一开始我写了个枚举7个点....... 但是貌似... 写挫了. 然后我就写dfs.. 判重好 ...
- hdu 4821 字符串hash+map判重 String (长春市赛区I题)
http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...
- HDU 5679 Substring 后缀数组判重
题意:求母串中有多少不同的包含x字符的子串 分析:(首先奉上FZU官方题解) 上面那个题就是SPOJ694 ,其实这两个题一样,原理每次从小到大扫后缀sa数组,加上新的当前后缀的若干前缀,再减去重复的 ...
- 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 ...
- 【DFS+小操作判重】【HDU2610+HDU2611】Sequence
题意 2610 按照长度优先 位置次之 输出所有不递减序列 2611 按照长度优先 大小次之 输出所有不递减序列 题解不写了 来源于http://www.cnblogs.com/wally/archi ...
- UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...
- hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)
Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- HDU2579--Dating with girls(2)--(DFS, 判重)
Dating with girls(2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
随机推荐
- mysql —备份和恢复
备份的目的 灾难恢复.硬件故障.软件故障.自然灾害.黑客攻击.误操作测试等数据 丢失场景 备份注意要点 能容忍最多丢失多少数据 恢复数据需要在多长时间内完成 需要恢复哪些数据 还原要点 做还原测试,用 ...
- Object.keys() 遍历对象
Object.keys()方法的运用与数组遍历 Object.keys()用于获得由对象属性名组成的数组,可与数组遍历相结合使用,用起来效果杠杠滴.数组遍历可以用for()或forEach()来实现, ...
- smarty建的mvc环境
================================搭建MVC结构================================基于MVC,解耦合 (高内聚,低耦合),优点:易维护.易扩 ...
- mybatis plus foreach 的用法
一: foreach 用于 select * from tablename where colname in (A,B,C……); 1:service 层: Set<String> tea ...
- Go 微服务架构Micro相关概念理解
Micro是一个微服务框架(或者说是工具集):提供了各类组件,解决微服务架构中的不同问题,服务监控.服务发现.熔断机制,负载均衡等等,自己一个个解决这些问题几乎不可能,这时候就需要借助go-micro ...
- c盘瘦身、windows解除上网限速、贴膜注意事项
1.c盘瘦身 1.1.https://zhidao.baidu.com/question/2057622451987202467.html 1.2.把C盘的swap空间换到D盘 2.windows解除 ...
- Data - 数据挖掘的基础概念
主要内容来自于<微信公众号:程SIR说> 1 数据挖掘 数据挖掘(Data Mining,简称DM),是指从大量的数据中,挖掘出未知的且有价值的信息和知识的过程. 数据挖掘是一门交叉学科, ...
- .NET Core微服务架构学习与实践系列文章索引目录
一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...
- 01.03 vim编辑器使用
==========linux基础命令的使用==========================绝对路径:由根目录(/)开始写起的文件名或目录名称相对路径:相对于目前路径的文件名写法(开头不是/就属于 ...
- fastjson带泛型反序列化的用法
这个问题之前就遇到了,虽然猜到有现成解决办法,但是一直没有正面解决,今天找到了解决方案,mark一下. 主要就是一个TypeReference的使用. 直接上代码比较容易看懂. 1.泛型 public ...