/*
°æ°ûÀÌ´Â



*/

#include <cstdio>
#include <stack>
#include <memory.h>
int n, M[500][500], D[500][500];
int max(int a, int b){ return a>b?a:b; }
int f(int a, int b, std::stack<int> S)
{
    if( a == n ) return 0;
    if( D[a][b] == -1 )
    {
        while(!S.empty() && S.top() <= M[a][b] ) S.pop();
        S.push(M[a][b]);
        D[a][b] = max(f(a+1,b,S), f(a+1,b+1,S)) + (int)S.size() - 1;
    }
    return D[a][b];
}
int main()
{
    freopen(".20.in","r",stdin);
    freopen(".20.out","w",stdout);
    memset(D,-1,sizeof(D));
    scanf("%d", &n);
    for(int i = 0 ; i < n ; i++ )
        for(int j = 0 ; j <= i ; j++ )
            scanf("%d", &M[i][j]);
    std::stack<int> S;
    printf("%d\n", f(0,0,S));
}
