给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。

 
Input
第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
Output
输出最长递增子序列的长度。
Input示例
8
5
1
6
8
2
4
5
10
Output示例
5
 #include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 50010
int a[N],c[N];
int n,len=;
int Find(int x)
{
int l=,r=len,mid;
while(l<=r){
mid=(l+r)>>;
if(x>c[mid]) l=mid+;
else r=mid-;
}
return l;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++){
int k=Find(a[i]);
c[k]=a[i];
len=max(len,k);
}
printf("%d\n",len);
return ;
}

STL 求最长上升子序列:

 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define inf 0x3f3f3f3f
int dp[];
int a[];
int main()
{
int n;
while(scanf("%d",&n) != EOF){
memset(dp,inf,sizeof(dp));
for(int i = ;i < n; i++)
scanf("%d",&a[i]);
for(int i = ;i < n; i++){
*lower_bound(dp,dp+n,a[i]) = a[i];
}
printf("%d\n",lower_bound(dp,dp+n,inf)-dp);
}
return ;
}

最新文章

  1. C#用扩展方法进行自动生成添加删除对象转换的功能
  2. input 正则限制输入内容
  3. 从零开始,做一个NodeJS博客(三):API实现-加载网易云音乐听歌排行
  4. 系统表达式(z变换、DTFT、差分方程)之间的关系
  5. Resources
  6. mysql概要(十二)事务
  7. 用python实现把数字人民币金额转换成大写的脚本程序
  8. 关于ios越狱开发的那些事
  9. 【Qt】Qt之自定义界面(实现无边框、可移动)【转】
  10. 在安装ISE的情况下,充分利用ISE的安装目录,查找资料
  11. Invoke()方法的使用
  12. Spring HibernateTemplate的使用
  13. vue1.0和vue2.0的区别(二)
  14. 201521123014 《Java程序设计》第12周学习总结
  15. python学习笔记 loop&amp;&amp;raw_input 7&amp;&amp; if
  16. linux服务搭建----NFS服务搭建
  17. .NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。
  18. [转] Quality Of Service In OpenStack
  19. Gradle项目BUG
  20. 最全免费CDN公共库——网站提速

热门文章

  1. 数据算法 --hadoop/spark数据处理技巧 --(17.小文件问题 18.MapReuce的大容量缓存)
  2. 一条Sql的Spark之旅
  3. VueJs一步步实现带感的帮助面板
  4. Error serializing object:序列化对象时出错
  5. Python3标准库:copy复制对象
  6. 如何利用Azure DevOps快速实现自动化构建、测试、打包及部署
  7. Spark基础和RDD
  8. Vue中import from的来源--省略后缀与加载文件夹
  9. MySQL基础(2) | 数据库、数据表
  10. MySQL 8 InnoDB 集群生产部署