//我看很多大神采用最长上升子序列来解,确实很简便,牛逼2333,作为一个编程新手,递归不是很会用,我就想用它试试
//采用递归的方法来写,用数组缓存来解决超时问题,不然试了好多次都超时
//转化成类似背包问题,找到紧邻的下一个更大的数(更高的桩),选择踩还是不踩,再
//找下一个相邻的更大的数(更高的桩)
//最终获得最长步数
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;</vector></string></iostream>

vector<int> C;
int D[400][400] = { -1 };//用数组缓存解决超时问题</int>

int f(int A, int B) { //递归函数,A是当前已经踩在的桩,B是下一个桩的位置
if (D[A][B] != -1)
return D[A][B];
if (B == (C.size() -1)) {
if (C[B] > A)
D[A][B] = 1;
else
D[A][B] = 0;
return D[A][B];
}
bool flag = false;
int mm = 0; //标记紧邻的下一个更大的数(更高的桩)的位置
for (int i = B; i < C.size(); i++)//查找下一个比当前脚下的桩更大的数(更高的桩)
if (C[i] > A) {
flag = true;
mm = i;
break;
}
if (flag) {
int p = 1 + f(C[mm], mm + 1);
int q = f(A, mm + 1);
D[A][B] = p > q ? p : q;
return D[A][B];
}
else
return 0;
}

int main() {
int M;
while (cin >> M) {
memset(D, -1, sizeof D); //初始化D数组
C.clear();
for (int i = 0; i < M; i++)
{
int buff;
cin >> buff;
C.push_back(buff);
}
cout << f(0, 0) << endl;
}
return 0;
}