1024 & 1025
2016-04-08 21:08
323 查看
概述:给出一行数,求给定个数的递增子串。
思路:DFS,从第一个数开始,找出下一个比它大的数,并在这个数的基础之上,再找出下一个比它大的数,找数的同时记录下子列的SIZE,等到找不到比它大的数的时候,退出此次。然后,从第二个数开始,重复以上步骤,直到最后为止,应当注意的是,要保证子列的输出顺序与样例中的一致,并且还要保证输出的子列个数小于P。
感想:无。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n, p, len, Count;
int num[1001];
bool flag;
struct Tem
{
int n, pos;
};
Tem tem[1001];
bool check(int from, int cur)
{
for (int i = from + 1; i < cur; i++)
if (num[i] == num[cur])
return false;
return true;
}
void print(int length)
{
for (int i = 0; i < length - 1; i++)
cout << tem[i].n << " ";
cout << tem[length - 1].n << endl;
}
void dfs(int dep, int pos)
{
if (Count >= p)return;
if (dep == len)
{
Count++;
flag = true;
print(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 = 0;
for (int i = 1; i < n; i++)
{
flag = false;
len = i;
dfs(0, 0);
if (Count >= p || !flag)break;
}
cout << endl;
}
return 0;
}
思路:DFS,从第一个数开始,找出下一个比它大的数,并在这个数的基础之上,再找出下一个比它大的数,找数的同时记录下子列的SIZE,等到找不到比它大的数的时候,退出此次。然后,从第二个数开始,重复以上步骤,直到最后为止,应当注意的是,要保证子列的输出顺序与样例中的一致,并且还要保证输出的子列个数小于P。
感想:无。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n, p, len, Count;
int num[1001];
bool flag;
struct Tem
{
int n, pos;
};
Tem tem[1001];
bool check(int from, int cur)
{
for (int i = from + 1; i < cur; i++)
if (num[i] == num[cur])
return false;
return true;
}
void print(int length)
{
for (int i = 0; i < length - 1; i++)
cout << tem[i].n << " ";
cout << tem[length - 1].n << endl;
}
void dfs(int dep, int pos)
{
if (Count >= p)return;
if (dep == len)
{
Count++;
flag = true;
print(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 = 0;
for (int i = 1; i < n; i++)
{
flag = false;
len = i;
dfs(0, 0);
if (Count >= p || !flag)break;
}
cout << endl;
}
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性