#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int MAX =1000;
int dp[MAX];
const int INF=0x3f3f3f3f;
int main()
{
int n;
int a[MAX];//数组
int i,j,k;
cin>>n;
for(i=0;i<n:i++)
cin>>a[i];
fill(dp,dp+n,INF);//fill类比memset
for(i=0;i<n;i++)
{
*lower_bound(dp,dp+n,a[i])=a[i];
}
printf("%d\n",lower_bound(dp,dp+n,INF)-dp);//输出
return 0;
}
/*
把a[]数组中插入 dp数组 每一次插入都会替换大于插入数 的位置
插入5
原序列为 1 6 8 9 INF INF 等这时 6的位置变为5 6去除
插入10
INF去掉一个 序列变为 1 6 8 9 10 INF
用lower_bound() 计算不大于INF的长度
相当于小的插入前面替换原先的数 大的替换INF
*/