#include <bits/stdc++.h>
usingnamespacestd;/*
dp[k]에 담겨있는 값 : 인덱스 k부터 마지막 인덱스까지의 부분 수열 중 가장 길이가 긴 부분 수열의 길이
seq : 주어진 수열
*/intdp[1001];intseq[1001];intn;// start 변수는 현재 seq에서의 인덱스를 의미한다.intsolve(intstart){int&ret=dp[start];// 갱신된 적이 없는 dp만 갱신한다.if(ret==0){for(inti=start+1;i<=n;++i){// 현재 인덱스의 dp값보다 뒤 인덱스 dp값이 더 크다면, LIS 조건을 만족하므로 해당 인덱스로 이동한다.// 리턴받은 값 + 1이 현재 dp값보다 크다면, 갱신한다. if(seq[i]>seq[start])ret=max(ret,solve(i)+1);}// 현재 인덱스보다 뒤에 있는 모든 seq값이 더 작다면 ret는 갱신되지 않는다.// 이 경우, dp 값은 1이 된다.if(ret==0)ret=1;}returnret;}intmain(void){scanf("%d",&n);for(inti=1;i<=n;++i)scanf("%d",&seq[i]);for(inti=1;i<=n;++i)solve(i);// dp배열 내 어느 위치의 값이 가장 큰지 탐색한다.intmaxVal=0;for(inti=1;i<=n;++i){if(maxVal<dp[i])maxVal=dp[i];}printf("%d",maxVal);}