最长递增自序列
来源:互联网 发布:覆盖文件恢复软件 编辑:程序博客网 时间:2024/05/22 04:30
题目传送门: https://www.51nod.com/onlineJudge/submitList.html#!userId=11254&problemId=1134
给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)
例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。(50000个数)
如果简单用dp递归的话,时间复杂度为o(n^2),肯定T了
查了题解后学到了一种优化版dp,时间复杂度是o(nlogn)
从头开始遍历,将不同长度的最大数字按照数列长度的大小储存起来,然后每次都用二分查找,找到不小于这个元素的第一个数字的位置,替换该数字
参考博客: http://blog.csdn.net/joylnwang/article/details/6766317
代码如下:
#include <iostream>#include <algorithm>#include <cstring>#include <stdio.h>#include <string>#include <cmath>#define ll long long#define mem(name,value) memset(name,value,sizeof(name))#define mod 1000000007#define PI 3.1415926#define E 2.718281828459using namespace std;const int maxn = 50005;int main() { int n; int a[maxn]; int dp[maxn]; mem(dp,0); cin >> n; for(int i=0;i<n;i++){ cin >> a[i]; } int len = 0; for(int i=0;i<n;i++){ int x = (lower_bound(dp,dp+len,a[i]) - dp); if(x == len) dp[len++] = a[i]; else dp[x] = a[i]; } int mx = 0; cout << len<< endl; return 0;}
0 0
- 最长递增自序列
- 最长递增自序列 python
- 求解数组中最长递增自序列
- 最长上升自序列
- 错误的求最长递增自序列算法——写完了才发现,有待于细心的你琢磨
- 3字符串求最长公共自序列
- 最长上升自序列的另一种解法。
- hdu1069!求最长上升自序列的和
- UVA - 10599 Robots(II)(最长上升自序列)
- bzoj3173 最长上升自序列 块状链表
- 动态规划之最长上升自序列问题
- 最长递增子列、最长公共子序列 python实现
- 回溯法——最长上升自序列问题(附源码)
- poj 1080(sum初始化&数组下标i&最长公共自序列类型)
- 自序
- 自序
- 自序
- 自序
- HDU 5320 Fan Li
- 提升树GBDT详解
- 交越失真及产生原因和改善方法
- leetcode之26. Remove Duplicates from Sorted Array(C++解法)
- 手机获取短信验证码——内置UI界面
- 最长递增自序列
- 设计模式概念及分类
- 《C语言入门经典》读后感(一)
- 锁的类型和兼容性
- 浅析SVN和Git在Eclipse和Studio中的使用技巧
- 【2016-大连赛区网络赛-G】(Friends and Enemies,hdu 5874)
- 日本樱花免费docker部署教程
- 美团点评2017校园招聘编程题--取红包
- 视觉直观感受 7 种常用的排序算法