/*
* Problem :: 1965 / 상자넣기
*
* Kind :: Dynamic Programming
*
* Insight
* - LIS = Longest Increasing Subsequence
* + max(len(LIS)) 를 구하는 문제이다
* # dp[i] = i 번째 상자를 마지막으로 하는 가장 긴 LIS 의 길이
* -> j = 0 ~ (i-1) 번째 상자를 탐색하며
* i 번째 상자가 j 번째 상자보다 크다면
* dp[i] 와 dp[j]+1 을 비교해서 dp[i] 를 갱신해주자
*
* Point
* - N=10^3 밖에 안되니
* O(N^2) 이어도 시간내에 널널하게 풀 수 있다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <algorithm>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N; cin >> N;
int A[N];
for (int i=0; i<N; i++)
cin >> A[i];
// Process
int dp[N]; /* dp[i] = i 번째 상자를 마지막으로 하는 가장 긴 LIS 의 길이 */
fill(dp, dp+N, 1); /* dp 를 1로 초기화 <= min(LIS)=1 */
for (int i=1; i<N; i++) {
for (int j=0; j<i; j++) {
if (A[i] > A[j]) { /* i 번째 상자가 j 번째 상자보다 크다면 */
dp[i] = max(dp[i], dp[j]+1); /* dp[i] 와 dp[j]+1 을 비교하여
* dp[i] 값을 갱신 */
}
}
}
// Control : Output
/* max(dp[i]) 를 출력 */
cout << *max_element(dp, dp+N) << endl;
}
// Helper Functions
/* None */