/*
题型:记忆化动归
注意哪里return,返回的是一个i,j的dp的值
*/
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=102;
int n,m;
int map[maxn][maxn];
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向数组
int ans=0;
int f[maxn][maxn];
bool jilu[maxn][maxn];
int dp(int x,int y)//一个i,j的dp
{
if(jilu[x][y]) return f[x][y];//记忆化
jilu[x][y]=1;//即visited或mark
int tp=0;
for(int i=0;i<4;i++)
{
int newx=x+d[i][0];
int newy=y+d[i][1];
if(map[newx][newy]<map[x][y] && newx>=1 && newy>=1 && newx<=n && newy<=m)//判断出界
tp=max(tp,dp(newx,newy));
}
f[x][y]=tp+1;//等都判断完了,路程加本身的1
return f[x][y];
}
int main()
{
scanf("%d%d",&n,&m);//长宽
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
ans=max(ans,dp(i,j));//ans记录所有f(i,j)的最大值,由于记忆化的存在,多次调用dp并不会很慢
}
printf("%d",ans);
return 0;
}