最长上升子序列问题
2016-04-02 16:22
295 查看
有一个长为n的数列a0,a1,...,an-1.请求出这个数列中最长的上升子序列的长度。上升子序列指的是对于任意的 i < j 都满足ai < aj 的子序列。
输入:
5
4 2 3 1 5
输出:
3 (2,3,5)
书中另外给出了的解法使用STL中的low_bound函数降低了时间复杂度。
这里只给出关键代码:
输入:
5
4 2 3 1 5
输出:
3 (2,3,5)
#include <cstdio> #include <algorithm> using namespace std; int n; int a[1000]; int dp[1000]; void solve() { int res = 0; for (int i = 0; i < n; i++){ dp[i] = 1; for (int j = 0; j < i; j++){ if (a[j] < a[i]){ dp[i] = max(dp[i], dp[j] + 1); } } res = max(res, dp[i]); } printf("%d\n", res); } int main() { while (scanf("%d", &n) != EOF){ for (int i = 0; i < n; i++){ scanf("%d", &a[i]); } solve(); } return 0; }
书中另外给出了的解法使用STL中的low_bound函数降低了时间复杂度。
这里只给出关键代码:
int dp[max_n]; void solve() { fill(dp, dp + n, INF); for (int i = 0; i < n; i++){ *lower_bound(dp, dp + n, a[i]) = a[i]; } printf("%d\n", lower_bound(dp, dp + n, INF) - dp); }
相关文章推荐
- Android NDK中打印信息能在eclipse中看到
- 测试用livewriter写blog
- js 恶心的遍历
- 欢迎使用CSDN-markdown编辑器
- 父进程与子进程
- nginx.conf配置文件中timeout超时时间设置
- 导入数据库error 1146 42s02错误
- 【转】android开发中关于模拟器emulation的常见问题
- 自定义视图
- 【图像算法】彩色图像切割专题八:基于MeanShift的彩色切割
- 获取磁盘列表以及磁盘信息的一些WIN32 API
- xchg汇编指令说明
- iOS界面篇 - bounds和frame的相同和区别
- 定义默认参数
- 指针与函数
- Java 中的二维数组
- 字符串哈希之Rabin-Karp,poj1200
- 构建之法阅读笔记01
- 单调连续递增子序列(O(n2)
- linux基础之命令Curl