Sequence one |
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 158 Accepted Submission(s): 49 |
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 Hint
Hint : You must make sure each subsequence in the subsequences is unique. |
Author
yifenfei
|
Source
奋斗的年代
|
Recommend
yifenfei
|
分析:通过枚举子串长度分别dfs知道没有输出或已达到要求个数,并且保证每次进入dfs采用的数都不同。
#include<cstdio> #include<cstring> int cnt; int a[1010]; int ans[1010]; int tot; int n, k; int flag; int fun(int x, int y) { int i; for (i = x; i < y; ++i) if (a[i] == a[y]) return 0; return 1; } void dfs(int now, int num) { int i; if (num == tot) { ++cnt; for (i = 0; i < tot - 1; ++i) printf("%d ", ans[i]); printf("%d\n", ans[tot - 1]); if (cnt == k) flag = 1; return; } if (num == 0) { // printf("**"); for (i = 0; i < n; ++i) { // printf("%d ",i); if (fun(0, i)) { // printf("%d ",i); ans[num]=a[i]; dfs(i, 1); if (flag) return; } } } else { for (i = now + 1; i < n; ++i) { if (a[i] >= a[now] && fun(now + 1, i)) { ans[num]=a[i]; dfs(i, num + 1); if (flag) return; } } } } int main() { int i, t; while (scanf("%d%d", &n, &k) != EOF) { for (i = 0; i < n; ++i) scanf("%d", &a[i]); cnt = 0; for (tot = 1; cnt < k; ++tot) { // printf("tot=%d\n",tot); flag = 0; t = cnt; dfs(0, 0); if(t==cnt) break; if (flag) break; } printf("\n"); } return 0; }