/*
* 2610_1.cpp
*
* Created on: 2013年8月17日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
//len:搜索的长度,count:记录有多少个串了
int n, p, len, count_num;
int num[1001];//num[] :用来记录序列中的每一个数字
//做一个标记,如果一个短的串都不能够找到,
//那么就长的串就更不可能找到了,这里的一个巧妙地剪枝如果没用就会超时
bool flag;
typedef struct {
int n, pos;
} Tem;
Tem tem[1001];//用来保存非递减序列的各个元素及其所在的位置
//若在产生序列的前一个数字到当前这个数字中,
//出现等于num[e]的,那么说明之前已经有序列选择了num[e],
bool check(int s, int e) {
for (int i = s + 1; i < e; i++)
if (num[i] == num[e])
return false;
return true;
}
void print_sequence(int length) {
for (int i = 0; i < length - 1; i++)
cout << tem[i].n << " ";
cout << tem[length - 1].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 != 0 && tem[dep - 1].n <= num[i]) || dep == 0) {
if (dep == 0 && !check(-1, i))
continue;
if (dep != 0 && !check(tem[dep - 1].pos, i))
continue;
tem[dep].n = num[i];
tem[dep].pos = i;
dfs(dep + 1, i + 1);
}
}
return;
}
int main() {
while (cin >> n >> p) {
for (int i = 0; i < n; i++)
cin >> num[i];
count_num = 0;
for (int i = 1; i < n; i++) {
flag = false;
len = i;
dfs(0, 0);
if (count_num >= p || !flag)
break;
}
cout << endl;
}
return 0;
}
hdu 2610
原创
©著作权归作者所有:来自51CTO博客作者CAIHONGSHIJIE6的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【算法题】2610. 转换二维数组
给你一个整数数组 nums。请你创建一个满足以下条件的二维数组:二维数组应该 只 包含数组 nums,1]]
算法 数据结构 二维数组 List 数组 -
sdut2610---Boring Counting(离线+树状数组+离散化)
Boring Counting Time Limit: 3000ms
树状数组 #include Memory ios