/*
每次将 b[i]<= k <b[i+1] 将b[i+1]换成k 最后就是 所求
类似于构造 最长不下降子序列 若 b[i]<= k <b[i+1] 将b[i+1]换成k 长度不减 ->区部调整
*/
/*
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
typedef long long ll;
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=998244353;
const int inf=0x3f3f3f3f;
int a[maxn],b[maxn],n;//吧b[i] 长度为i的序列 结尾中 最小的值
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int len=0;
for(int i=1;i<=n;i++){
if(a[i]>b[len]) b[++len]=a[i];
else{
int pos=upper_bound(b+1,b+1+len,b[i])-b;
b[pos]=a[i];
}
}
cout<<len<<'\n';
return 0;
}