#include <iostream> #include <string.h> using namespace std; int ans[101][101];//存储当前位置能得到的最优解 int map[101][101];//存储当前位置的元素值 int dir[4][2]={1,0,0,1,-1,0,0,-1};//四个方向,右,上,左,下 int N,M; int max(int a,int b) { return a>b?a:b; } int dp(int i,int j)//得到[i,j]位置的最优解 { if(ans[i][j]>0) return ans[i][j]; //寻找四个方向的局部满足要求的最优解 int t,tempi,tempj; int maxn=0; for(t=0;t<4;t++) { tempi=i+dir[t][0]; tempj=j+dir[t][1]; if(tempi>0&&tempi<=N&&tempj>0&&tempj<=M) //不可越界 { if(map[tempi][tempj]<map[i][j])//低于[i,j] maxn=max(maxn,dp(tempi,tempj)); } } return ans[i][j]=maxn+1; } int main() { while(cin >>N >> M) { int answer=0; int i,j; for(i=1;i<=N;i++) { for(j=1;j<=M;j++) { cin >> map[i][j]; } } memset(ans,0,sizeof(ans)); for(i=1;i<=N;i++) { for(j=1;j<=M;j++) { ans[i][j]=dp(i,j);//得到[i,j]位置的最优解 answer=max(answer,ans[i][j]);//更新整体最优解 } } cout << answer; } return 0; }