HDU2610 Sequence one DFS 简单题 好题

             Sequence one

Problem Description

Search is important in the acm algorithm. When you want to solve a problem by using the search method, try to cut is very important.
Now give you a number sequence, include n (<=1000) integers, each integer not bigger than 2^31, you want to find the first P subsequences that is not decrease (if total subsequence W is smaller than P, than just give the first W subsequences). The order of subsequences is that: first order the length of the subsequence. Second order the sequence of each integer’s position in the initial sequence. For example initial sequence 1 3 2 the total legal subsequences is 5. According to order is {1}; {3}; {2}; {1,3}; {1,2}. {1,3} is first than {1,2} because the sequence of each integer’s position in the initial sequence are {1,2} and {1,3}. {1,2} is smaller than {1,3}. If you also can not understand , please see the sample carefully.

Input

The input contains multiple test cases.
Each test case include, first two integers n, P. (1<n<=1000, 1<p<=10000).

Output

For each test case output the sequences according to the problem description. And at the end of each case follow a empty line.

Sample Input

3 5

1 3 2

3 6

1 3 2

4 100

1 2 3 2

Sample Output

1

3

2

1 3

1 2

1

3

2

1 3

1 2

1

2

3

1 2

1 3

2 3

2 2

1 2 3

1 2 2

题意:给出一个序列,要你输出这个序列的前p个序列(若总排列w<p,则只需要输出w个)

排列方式:

0.序列为原序列的非减子序列

1.length从小到大

2.length相同的话,位置前的排在前面

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

技巧一:重判,这里有两个重判,第一个重判是判断如果搜索的是子序列的第一个元素,那么判断从原始序列开始到当前位置是否已经出现过该元素,若出现过则之前肯定搜索过该元素,则放弃该元素的搜索。第二个重判,当搜索的不是子序列的第一个元素时,则判断子序列的前一个元素对应原始序列的位置,然后从该位置下一个元素开始到到当前搜索的位置之前判断该元素是否出现过,如果出现过,说明该子串出现过重复的,则放弃该元素。

技巧二:剪枝,这里的一个剪枝技巧是做了一个标记位flag,假如我在搜索长度为3的子串时,发现没有一个符合的,那么就不可能存在长度为4的子串符合条件。如果没有这个剪枝就会超时。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

这道题有一个地方使我wa了很久,写在了注释里面。

 1 #include<iostream>
 2 #include<set>
 3 #include<cstring>
 4 #define LL long long
 5 using namespace std;
 6
 7 const int maxn=1010;
 8 LL a[maxn];
 9 LL ans[10000];
10 int n,p,len;
11 bool flag;
12
13 set<LL>ssss;
14 set<LL>::iterator it;
15
16 void dfs(int cur,int cnt)
17 {
18     if(cnt>len)
19         return ;
20     ans[cnt]=a[cur];
21     if(cnt==len)
22     {
23         for(int i=1;i<cnt;i++)
24             cout<<ans[i]<<" ";
25         cout<<ans[cnt]<<endl;
26         flag=true;
27         p--;
28         return ;
29     }
30     //开始这个set是写在了函数外面,然后一直wa
31     //写在外面,dfs操作的其实一直是同一个s,前面的可能也会被clear()
32     set<LL>s;
33     s.clear();
34     for(int i=cur+1;i<=n;i++)
35     {
36         if(a[i]>=a[cur]&&p>0)
37         {
38             it=s.find(a[i]);
39             if(it!=s.end())
40                 continue;
41             dfs(i,cnt+1);
42             s.insert(a[i]);
43         }
44     }
45 }
46
47 int main()
48 {
49     while(cin>>n>>p)
50     {
51         for(int i=1;i<=n;i++)
52             cin>>a[i];
53         int m=0;
54         ssss.clear();
55         for(int i=1;i<=n;i++)
56         {
57             it=ssss.find(a[i]);
58             if(it!=ssss.end())
59                 continue;
60             cout<<a[i]<<endl;
61             ssss.insert(a[i]);
62             m++;
63             if(m>=p)
64                 break;
65         }
66         p-=m;
67         len=2;
68         ssss.clear();
69         while(p>0&&len<=n)
70         {
71             flag=false;
72             ssss.clear();
73             for(int i=1;i<=(n-len+1);i++)
74             {
75                 it=ssss.find(a[i]);
76                 if(it!=ssss.end())
77                     continue;
78                 dfs(i,1);
79                 ssss.insert(a[i]);
80             }
81             if(!flag)
82                 break;
83             len++;
84         }
85         cout<<endl;
86     }
87     return 0;
88 }

时间: 2024-10-25 00:19:35

HDU2610 Sequence one DFS 简单题 好题的相关文章

fzu 1920 Left Mouse Button(简单深搜题)

题目地址:http://acm.fzu.edu.cn/problem.php?pid=1920 题目大意是给定一个n*n的图,模拟扫雷游戏,0代表没有雷区,1代表附近九宫格内只有一个雷-- 如果不懂的话去玩下扫雷,挺好玩的,99个雷的玩了好几百盘才赢了一次............ 此题假设神操作,点不到雷,问你最少要多少下才可以把图中非雷的点完,怎么样才最快呢? 当然先点0啦,,,,,,,, 好吧,不废话了..... ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1

Codeforces Round #259 (Div. 2) (简单模拟实现题)

题目链接:http://codeforces.com/problemset/problem/454/A A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine

一道简单的数据结构题 栈的使用(括号配对)

一道简单的数据结构题 发布时间: 2017年6月3日 18:46   最后更新: 2017年6月3日 18:51   时间限制: 1000ms   内存限制: 128M 描述 如果插入"+"和"1"到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的.例如,序列"(())()", "()"和"(()(()))"是合法的,但是")(", "(()&quo

Number Sequence - HDU 1711(KMP模板题)

题意:给你一个a串和一个b串,问b串是否是a串的子串,如果是返回b在a中最早出现的位置,否则输出-1 分析:应该是最简单的模板题了吧..... 代码如下: ============================================================================================== #include<stdio.h> #include<string.h> const int MAXM = 1e4+7; const int

hdu1010-Tempter of the Bone DFS深搜入门题+奇偶剪枝

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 69699    Accepted Submission(s): 19176 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

从一道简单的dp题中学到的...

今天想学点动态规划的知识,于是就看了杭电的课件,数塔问题啊,LCS啊都是比较经典的动规了,然后随便看了看就开始做课后练习题... HDOJ 1421 搬寝室 http://acm.hdu.edu.cn/showproblem.php?pid=1421 题目大意:从n(n <= 2000)个数中选出k对数(即2*k个),使它们的差的平方和最小. 例如:从8,1,10,9,9中选出2对数,要使差的平方和最小,则应该选8和9.9和10,这样最小,结果为2 因为知道是dp的题,先建个dp[][]数组,然

简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现。

简单的算法题, Find Minimum in Rotated Sorted Array 的Python实现. 题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in t

3211: 简单的编程题

3211: 简单的编程题 时间限制: 1 Sec  内存限制: 128 MB提交: 162  解决: 53[提交][状态][讨论版][命题人:lyh] 题目描述 编写一个程序,对于从键盘输入的2个整数m,n(n,m<=10^6),先输出较大者的个位数字,然后输出较小者的平方. 输入 10 50 输出 0 100 样例输入 10 50 样例输出 0 100 提示 long long int 在输入输出是用 %lld . #include<stdio.h> int main() { long

网易2017春招笔试真题编程题集合题解

01 双核处理 题目 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务.n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间. 输入描述 输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个整数lengthi,表示每个任务的长度为length[i]kb,每个数均为1024的倍数. 输出描述输出一个整数,表示最少需