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));
}