'''
解题思路:
动态规划,最长上升子序列
dp[i]定义:在位置i处结束的,最长上升子序列长度
更新公式:当L[i]>L[j]时,p[i]= max(dp[j]+1, dp[i]),j为i之前所有的位置
边界条件:dp[i] = 1
'''
while 1:
try:
pass
n = int(input())
L = list(map(int,input().strip().split()))
#print('n=',n)
#print('L=',L)
#------------------------------
# dp[i],0<=i<=n-1,以i为终点上升子序列的最大长度
dp = [1]*n
maxLen = 0
for i in range(1,n): # 第i个桩高度L[i]
for j in range(0,i): # 第0~i-1个桩调度L[0]~L[i-1]
if L[i]>L[j]: # 如果存在L[i]>L[j]则maxLen[i]需更新
dp[i]= max(dp[j]+1, dp[i]) # 在0<=j<=i-1中,保留更大的更新
if dp[i]>maxLen:
maxLen = dp[i] # 最大的更新对maxLen[i]赋值
print(maxLen) # 对所有maxLen[i]取最大
except:
break