逻辑见注释
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define ffor(i,s,e) for(int i=s;i<e;i++)
const int N = 310;
int R,C;
int a[N][N];
int f[N][N];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
bool check(int x,int y){
return x<=R&&x>0&&y<=C&&y>0;
}
int getLen(int x,int y){
int &ans=f[x][y];//取别名,并将结果记忆在数组中
if(ans) return ans;
ffor(i,0,4){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(check(nx,ny)&&a[x][y]>a[nx][ny]){
//向满足条件的下一步继续深搜
ans=max(ans,getLen(nx,ny)+1);
}
}
return ans;
}
int main()
{
cin>>R>>C;
ffor(i,1,R+1) ffor(j,1,C+1){
scanf("%d", &a[i][j]);
}
//遍历R*C个位置找最大值
int res=0;
ffor(i,1,R+1) ffor(j,1,C+1){
res=max(res,getLen(i,j));
}
cout<<res+1<<endl;//加上起点那一步
return 0;
}