二分+dp
#include <iostream>
#include <cstring>
#include <cstdio>
const int MAX = 5e4 + 5;
int arr[MAX];
int dp[MAX];
int binary_search(int arr[], int lenth, int val)
{
int l = 0, r = lenth - 1;
while (l <= r)
{
int m = (l + r) >> 1;
if (arr[m] <= val)
l = m + 1;
else
r = m - 1;
}
return l;
}
int main()
{
int num;
scanf("%d", &num);
for (int i = 0; i != num; ++i)
{
scanf("%d", &arr[i]);
}
int max_lenth = 0;
dp[max_lenth] = arr[0];
for (int i = 1; i < num; ++i)
{
if (arr[i] > dp[max_lenth])
{
dp[++max_lenth] = arr[i];
}
else
{
int tmp = binary_search(dp, max_lenth + 1, arr[i]);
dp[tmp] = arr[i];
}
}
printf ("%d\n", max_lenth + 1);
return 0;
}