经典的dp题
#include
#include
#include
using namespace std;
const int N = 100000;
int dp[N];
int a[N];
int bit(int n, int val)
{
int i = 0;
int j = n;
while(i <= j)
{
int mid = (i+j)/2;
if(dp[mid] <= val) i = mid+1;
else j = mid-1;
}
return i;
}
void debug(int n)
{
for(int i = 0; i <= n; i++)
printf("%d ", dp[i]);
printf("\n");
}
int main(void)
{
int n;
while(~scanf("%d", &n))
{
int i;
for(i = 0; i < n; i++) scanf("%d", &a[i]);
dp[0] = a[0];
int k = 0;
for(i = 1; i < n; i++)
{
if(dp[k] <= a[i])
{
dp[++k] = a[i];
}
else
{
int tmp = bit(k, a[i]);
dp[tmp] = a[i];
}
}
//debug(k);
printf("%d\n", k+1);
}
return 0;
}