while True:
    try:
        n, nums = int(input()), list(map(int, input().split()))
        dp = [1] * n
        for i in range(n):
            for j in range(i):
                if nums[j] < nums[i]:
                    dp[i] = max(dp[i], dp[j] + 1)
        print(max(dp))
    except:
        break


# 梅花桩_动态规划(Python)
# 关于初始化
# 数组 dp 中存储着对应 nums 位置的桩最大次数,所以创建的时候默认为 1,因为当前桩本身就是一步。
# 关于状态转移方程
# 其中 nums[j] < nums[i],即扫描 i 前面的桩,
# 如果有比 i 小的话就使用状态转移方程 dp[i] = max(dp[i], dp[j] + 1),
# 方程的意思是————如果前面某个桩(桩j)比 桩i 小,那么从那个桩踩上 桩i 的话自然就多了一步,
# 我们拿这个踩完之后的步数 dp[j] + 1 跟当前存储的最大步数 dp[i] 比较一下,
# 选个大的放进去。