//为这题……整个人烦到极顶……
#include<iostream>
using namespace std;
int map[101][101];
int dp[101][101];//dp[i][j]表示从i j 出发能够到达的最大长度
int m,n;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int dfs(int si,int sj)
{
    
int k,vi,vj,mt,temp;
    
if(dp[si][sj] > 0)
        
return dp[si][sj];
    mt
=0;
    
for(k=0;k<4;k++)
    
{
        vi
=si+dir[k][0];
        vj
=sj+dir[k][1];
        
if(vi>=1 && vi<=&& vj>=1 && vj<=n )
        
{
            
if(map[vi][vj] > map[si][sj] )
            
{
                temp 
= dfs(vi,vj);
                
if(temp > mt)
                    mt 
= temp;
            }

        }

    }
//for(k=0;k<4;k++)
    dp[si][sj] = mt+1;
    
return mt+1;
}


int main()
{
    
while(cin>>m>>n)
    
{
        
int i,j;
        
for(i=1;i<=m;i++)
            
for(j=1;j<=n;j++)
            
{
                scanf(
"%d",&map[i][j]);
                dp[i][j] 
= 0;
            }
        
        
for(i=1;i<=m;i++)
            
for(j=1;j<=n;j++)
                dfs(i,j);
        
int M=0;
        
for(i=1;i<=m;i++)
            
for(j=1;j<=n;j++)
                
if(dp[i][j] > M)    
                    M 
= dp[i][j];
        cout
<<M<<endl;
    }

    
return 0;
}
http://acm.pku.edu.cn/JudgeOnline/problem?id=1088