思路:用len[i]记录长度为i时的上升子序列对应的最小的那个数,每次插入一个数就更新len数组,使用二分查找进行修改操作,时间复杂度为O(nlogn),最后i的值就是上升子序列的最大长度。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100005];
int Binary(int temp, int len)
{
int l = 1, r = len, mid;
while(l <= r)
{
mid = (l + r) >> 1;
if(temp > a[mid])
l = mid + 1;
else
r = mid - 1;
}
return l;
}
int main(int argc, char const *argv[])
{
int n, len, k, temp, idx;
/* freopen("in.c", "r", stdin); */
while(~scanf("%d", &n))
{
len = 0;
memset(a, 0, sizeof(a));
for(int i = 1;i <= n;i ++)
{
scanf("%d", &temp);
if(temp > a[len])
a[++len] = temp;
else
{
idx = Binary(temp, len);
a[idx] = temp;
}
}
printf("%d\n", len);
}
return 0;
}