对于全排列枚举的数列的判重技巧

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的判重技巧的更多相关文章

  1. POJ 3050 枚举+dfs+set判重

    思路: 枚举+搜一下+判个重 ==AC //By SiriusRen #include <set> #include <cstdio> using namespace std; ...

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

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

  3. hdu 4821 字符串hash+map判重 String (长春市赛区I题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...

  4. HDU 5679 Substring 后缀数组判重

    题意:求母串中有多少不同的包含x字符的子串 分析:(首先奉上FZU官方题解) 上面那个题就是SPOJ694 ,其实这两个题一样,原理每次从小到大扫后缀sa数组,加上新的当前后缀的若干前缀,再减去重复的 ...

  5. 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 ...

  6. 【DFS+小操作判重】【HDU2610+HDU2611】Sequence

    题意 2610 按照长度优先 位置次之 输出所有不递减序列 2611 按照长度优先 大小次之 输出所有不递减序列 题解不写了 来源于http://www.cnblogs.com/wally/archi ...

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

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

  8. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

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

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

随机推荐

  1. 数据库groub by分组后,把多行数据合并成一行数据(Oracle、Postgres)

    关键字 row_number() over (partition by)   例如,下面的数据, 这是按照name分组后,展示property值. 我们想得到这样的值; 第一步:将每一组的proper ...

  2. Embedded based learning

    简单整理了一些嵌入式底层需要接触的相关概念.   # CPU  CU. Control Unit. send need-clac-data -> ALU clac -> get resul ...

  3. 【I·M·U_Ops】------Ⅰ------ IMU自动化运维平台设想

    说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 搞这个平台的初心 由于之前呆的单位所有IT相关硬件资源都要我们 ...

  4. kotlin泛型中星号投射

    如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现 ...

  5. kotlin泛型类型变异

    在java泛型中中会有 ? extends E 可以解决类似于List<String> 赋给List<Object>  的问题,但是在kotlin泛型中并没有提供通配符,而是o ...

  6. LocalDB数据库修改排序规则,修复汉字变问号

    VS中新增的轻量级数据库LocalDB,有个这个,开发人员就不必再安装庞大的SQL server了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...

  7. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_11-freemarker静态化测试-基于模板字符串静态化

    再定义一个测试方法 把拿到的字符串变成模板 加载器设置好了以后, 加一个断点来测试 生成模板文件 上面这种方式很灵活. 最终代码 @Test public void testGenerateHtmlB ...

  8. MSMQ菜鸟教程

    一  .MSMQ概述 MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于 ...

  9. 怎么理解linux的平均负载及平均负载高后的排查工具

    什么是平均负载 平均负载可以对于我们来说及熟悉又陌生,但我们问平均负载是什么,但大部分人都回答说平均负载不就是单位时间内CPU使用率吗?其实并不是这样的,如果可以的话,可以 man uptime 来了 ...

  10. xdebug调试的原理

    转自 https://segmentfault.com/a/1190000002528341 使用PhpStorm+xdebug单步调试程序可以快速帮助自己熟悉项目代码! 运行原理 在实际使用前,我们 ...