题目描述
PIPI又来考大家最长上升子序列问题了~
不过这次它想为难一下你~
给你一个整数序列,包含n个整数,要你求最长上升子序列的长度~
输入
多组输入
第一行为一个整数n,1<=n<=1000000
第二行包括n个整数,每个整数均在int范围内
输出
输出一个整数,表示最长上升子序列的长度。
样例输入
5
1 2 5 4 7
样例输出
4
#include <bits/stdc++.h>
using namespace std;
int n;
const int N=1e6+5,INF=1e9;
int B[N],A[N]; ///B[i]表示最长上升子序列为长度为i时的末尾最小值
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++){
scanf("%d",&A[i]);
}
int len=1;
B[len]=A[1]; ///初试化B[1]的值
for(int i=2;i<=n;i++)
{
if(A[i]>B[len]) ///A[i]的值大于B长度为len的末尾的值时,将A[i]放到B数组的末尾
B[++len]=A[i];
else
{
int pos=lower_bound(B+1,B+len+1,A[i])-B; ///二分法找到更小的A[i]应该存放的B的位置,比如 1 3 4 此时遇到2,应该用2将3替换掉,变成1 2 4,1 2比1 3更小
B[pos]=A[i];
}
}
printf("%d\n",len);
}
return 0;
}