d = [0 for i in range(1002)]
n = int(input())
a = list(map(int, input().split()))
d[0] = 1
for i in range(1, n):
    d[i] = 1
    for j in range(0, i):
        if a[j] < a[i]:
            d[i] = max(d[i], d[j] + 1)
print(max(d))O(n^2)
#include <bits/stdc++.h>
using namespace std;
int d[1001];
int num[1001];
int main(void){
    int n = 0, mx = 0;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> num[i];
    
    for (int i = 0; i <n ;i++)
        d[i] = 1;
    for (int i = 1; i < n; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (num[i] > num[j])
                d[i] = max(d[i], d[j] + 1);
        }
    }
    cout << *max_element(d, d+n);
}#include <bits/stdc++.h>
using namespace std;
int main(void){
    int n = 0;
    cin >> n;
    vector<int> v;
    
    for (int i = 0; i < n ; i++)
    {
        int num = 0;
        cin >> num;
        auto it = lower_bound(v.begin(), v.end(), num);
        if (it != v.end())
            *it = num;
        else
            v.push_back(num);
    }
    cout << v.size();
}이진탐색, O(nlogN)
n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]
for i in range(1, len(dp)):
    if dp[i-1] + arr[i] > arr[i]:
        dp[i] = dp[i-1] + arr[i]
    else:
        dp[i] = arr[i]
mx = max(dp)
print(mx)#include <bits/stdc++.h>
using namespace std;
long long num[100001];
long long d[100001];
int main(void){
    int n = 0;
    cin >> n;
    
    for (int i = 0; i<n ; i++)
        cin >> num[i];
    d[0] = num[0];
    for (int i = 1; i < n; i++)
    {
        if (d[i-1] + num[i] > num[i])
            d[i] = d[i-1] + num[i];
        else
            d[i] = num[i];
    }
    
    cout << *max_element(d, d+n);
}
n, m = map(int, input().split())
board = [list(map(int, input())) for _ in range(n)] # 배열 입력받음
dp = [[0] * m for _ in range(n)]  # 정사각형의 한변 길이 저장
for i in range(n):
    dp[i][0] = board[i][0]
    
for j in range(m):
    dp[0][j] = board[0][j]
    
for i in range(1, n):
    for j in range(1, m):
        cur = min(min(dp[i-1][j-1], dp[i-1][j]), dp[i][j-1])
        if board[i][j] != 0:
            dp[i][j] = cur + board[i][j]
	# board[i][j] == 0 이면 dp[i][j]는 그대로 0
mx = max(map(max, dp)) # 2차원 리스트에서 최대값 구하기
print(mx * mx)