//滑雪,记忆化搜索解决
//dp[i][j]表示从(i,j)开始出发所能滑的最长长度
//显然状态转移方程为dp[i][j]=max{上下左右四个方向的dp值}+1;
//我们只需要在DP过程中时刻更新最大值MAX即可
#include <stdio.h>
#include <string.h>
#define N 110
int R,C;
int a[N][N],dp[N][N],MAX;
bool vis[N][N];
int x[5]={0,-1,1,0,0}, y[5]={0,0,0,-1,1};
void DP(int i , int j)
{
int k,xx,yy,tmp;
if(vis[i][j]) return ;
vis[i][j]=1;
dp[i][j]=1;
for(k=1; k<=4; k++) //枚举四个方向
{
xx=i+x[k]; yy=j+y[k]; //得到新的坐标
if( xx>=1 && xx<=R && yy>=1 && yy<=C && a[xx][yy]>a[i][j] )
{
DP(xx,yy);
if(dp[xx][yy]+1 > dp[i][j])
dp[i][j]=dp[xx][yy]+1;
}
}
return ;
}
int main()
{
int i,j;
while(scanf("%d%d",&R,&C)!=EOF)
{
for(i=1; i<=R; i++)
for(j=1; j<=C; j++)
scanf("%d",&a[i][j]);
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
MAX=-1;
for(i=1; i<=R; i++)
for(j=1; j<=C; j++)
if(!vis[i][j])
{
DP(i,j);
MAX=MAX>dp[i][j]?MAX:dp[i][j];
}
printf("%d\n",MAX);
}
return 0;
}