#include<bits/stdc++.h>
using namespace std;
int n;
int a[1005],f[1005];
int main() {
	int i, j;
	cin>> n; int ans=0;
	for (i=0; i<n; i++)cin>>a[i];
	for (i=0; i<n; ++i) {
		f[i] = 1;
		for(j= i-1; j>=0; --j)
			if(a[i]>a[j])f[i]= max(f[i],f[j]+1);
		ans =max(ans,f[i]);
	}
	cout<< ans<<"\n";
	return 0;
}# include <iostream>
using namespace std;
const int maxn=100005;
int n;
int a[maxn];
int b[maxn];
void solve(int l, int r)
{
	if (l==r) return ;
	int mid=(l+r)/2;
	solve(l, mid); solve(mid+1,r);
	int i=1,j=mid+1,k=1;
	while(i<=mid &&j<=r)
	{
		if (a[i]<=a[j]) b[k++]=a[i++];
		else b[k++]=a[j++]; 
	}
	while(i<=mid) b[k++]=a[i++];
	while(j<=r) b[k++]=a[j++];
	for (int i=l; i<=r; i++) a[i]=b[i]; 
}
int main(){
	cin>>n;
	for (int i=1; i<=n; i++) cin>>a[i];
	solve(1,n);
	int ans=0;
	for (int i=1; i<=n; i++) ans=ans+a[i]*i;
	cout<<ans<<endl;
	return 0;
}#include <stdio.h>
char c[200][200];
int s[200], m, n;
void numara() {
	int i,j, cod, nr;
	for(j=0; j<n; j++) {
		nr=0; cod=1;
		for(i=0; i<m; i++) {
			if(c[i][j]=='1') {
				if(!cod) {cod=1;s[nr]++;nr=0;}
			}
			else {
				if (cod) {nr=1;cod=0;} 
				else nr++;
			}
		}
		if(!cod) s[nr]++;
	}
}
int main() {
	int i,j;
	scanf("%d %d\n", &m, &n);
	for(i= 0; i<m; i++) gets(c[i]);
	numara();
	for(i=1; i<=m; i++)
		if(s[i]!= 0) printf("%d %d",i, s[i]);
	return 0;
}#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n, m, tot;
vector <int> t;
int lc[N], rc[N];
inline bool isleaf(int u) { ___(1)___;}
inline bool solve(vector <int> t) {
	if (t.empty()) return false;
	for (auto o : t) if (isleaf(o)) return true;
	vector<int> t1,t2,t3,t4;
	for (auto o : t) {
		if(!lc[o]) t2.push_back(rc[o]);
		if(!rc[o]) t1.push_back(lc[o]);
		if( ___(2)___ ) {
			if (isleaf(lc[o])) t3.push_back(rc[o]);
			if (isleaf(rc[o])) t4.push_back(lc[o]);
		}
	}
	___(3)___;
}
int main() {
	scanf("%d", &m);
	for (int i=1; i<=m; ++i) {
		int n;	scanf("%d" ,&n);___(4)___;
		for (int j=1; j<=n; ++j) {
			scanf("%d", &lc[tot+j]); if (lc[tot+j]) lc[tot+j] += tot;
			scanf("%d", &rc[tot+j]); if (rc[tot+j]) rc[tot+j] += tot;
		}
		___(5)___;
	}
	if (solve(t)) printf("Almost Complete\n");
	else printf("No\n");
	return 0;
} 
#include <stdio.h>
#include <math.h>
int orig, n, ns, a [102][102], bun;
int d[]= {1,0,-1,0,0,1,___(1)___};
void plimba(int x, int y) {
	int i,xx, yy;
	a[x][y]=-a[x][y] ;
	if(abs(a[x-1][y] ) != orig&&( ___(2)___ != a[x-1][y]||abs (a[x][y-1] ) != orig))		ns++;
	if(abs (a[x+1][y] ) != orig&& (a[x+1][y-1] !=a[x+1][y]||abs (a[x][y-1] ) !=orig))		ns++;
	if(abs (a[x][y-1] )!=orig&&( ___(3)___ !=a[x][y-1] ||abs (a[x-1][y] ) !=orig))	ns++;
	if(abs(a[x][y+1] ) !=orig&&(a[x-1][y+1]!=a[x][y+1]||abs(a[x-1][y]) !=orig))	ns++;
	for(i=0; i<4 ; i++) {
		xx=x+d[2*i]; yy=y+___(4)___;
		if(xx>=1&&xx<=n&&yy>=1&&yy<=n&& ___(5)___ )plimba(xx,yy);
	}
}
int main () {
	int i,j;
	bun=1;
	scanf("%d",&n);
	for (i=0; i<=n+1; i++)
	for (j=0; j<=n+1; j++)	a[i][j]=0;
	a[0][0]=-1;	a[n+1][0]=-1;
	a[0][n+1]=-1;	a[n+1][n+1]=-1;
	for (i=1; i<=n; i++)
	for (j=1; j<=n; j++) scanf("%d",&a[i][j]);
	for (i=1; i<=n ; i++)
		for(j=1; j<=n; j++) {
			if(a[i][j]>-1) {
				ns=0; ___(6)___;				
				plimba (i,j);
				if(ns%2==1) bun=0;
			}
		}
	if (bun)printf("YES\n");else printf("NO\n");
	return 0;
}