/*
首先这个算法不是我想出来的,是看了别人的算法后添加了自己的理解
这个题目的解题思路和正常思维不同
不是将每个位置视为起点,而是视为终点,求出该位置的最大上升次数
再求出所有位置的最大上升次数的最大值
*/

include

using namespace std;

define max(a,b) (a>b)?a:b

int main(){
int n;
while(cin >> n){
int array[65536] = {0};//输入缓存
int times[65536] = {0};//对应每个位置之前的最大上升次数
int max_times = 1;//最大上升次数,输出值

    for (int i = 0; i < n; i++)
        cin >> array[i];

    times[0] = 1;
    for (int i = 1; i < n; i++){
        times[i] = 1;
        for(int j = 0; j < i; j++){
            if (array[i]>array[j])
                times[i] = max(times[i], times[j]+1);
        }
        if (times[i] > max_times)
            max_times = times[i];
    }
    cout << max_times << endl;
}
return 0;

}