定理
最长上升子序列=序列中非严格下降个数(HDU-1257)。
证明略。
算法(nlogn)
用一个数组B来存最长上升子序列中的值,如果a[i]>b[res],那么说明可以放到最后面,否则可以把B中第一个大于它的替换掉。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
using namespace std;
int a[1005];
int b[1005];
int main()
{
int n;
while (~scanf("%d", &n))
{
for (int i = 1;i <= n;i++)scanf("%d", &a[i]);
int res = 1;
b[1] = a[1];
int ans = 1;
for (int i = 2;i <= n;i++)
{
int j;
if (a[i] > b[res])
{
res++;
j = res;
}
else
j = upper_bound(b + 1, b + 1 + res, a[i]) - b;
b[j] = a[i];
ans = max(ans, res);
}
cout << ans << endl;
}
}