while (readline()) {
let arr = readline().split(" ").map(Number);
let len = arr.length;
// dp[i] 表示以第 i 个桩为结尾,最多走多少步,初始是 1 步(默认这个桩是跟它之前相比最矮的)
let dp = new Array(len).fill(1);
for (let i = 0; i < len; i++) {
for (let j = 0; j < i; j++) {
if (arr[i] > arr[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
// 如果第i个桩前面有比它矮的(比如是j),
// 且以第j个桩为结尾走的步数是最多的,
// 步数就是dp[j]+1,加的这个1表示从第j个走1步到第i个桩;另一种就是dp[i],默认等于1,但是
// 遍历j的过程可能会更新这个值,因此取上述两个结果中最大的那个值,表示第i个桩为结尾,
// 最多走多少步
}
}
}
print(Math.max(...dp));
}