最长单增子序列
(LIS Longest Increasing Subsequence)给定一个数列,从中删掉任意若干项剩余的序列叫做它的一个子序列,求它的最长的子序列,满足子序列中的元素是单调递增的。
输入
第1行:1个数N,N为序列的长度(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
输出
输出最长递增子序列的长度。
输入示例
8 5 1 6 8 2 4 5 10
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <stack>
#include <vector>
#include <set>
#include <queue>
using namespace std;
int n,a[50005],d[50005],i,j,len;
int binsearch(int x)
{
int l = 1, r = len, mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (d[mid-1] <= x && x < d[mid]) return mid;
else if (x > d[mid]) l = mid + 1;
else r = mid - 1;
}
}
int main()
{
scanf ("%d", &n);
for (i = 1; i<= n; i++)
scanf ("%d", &a[i]);
memset (d, 0, sizeof (d));
d[1] = a[1];
len = 1;
for (i = 2; i <= n; i++)
{
if (a[i] < d[1]) j = 1;
else if (a[i] > d[len]) j = ++len;
else j = binsearch (a[i]);
d[j] = a[i];
}
printf ("%d\n", len);
return 0;
}