http://bailian.openjudge.cn/practice/1088

#include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<math.h>
 #include<iostream>
 #include<algorithm>
 using namespace std;


 int mat[120][120];
 int dp[120][120];
 struct ele
 {
     int x;
     int y;
     int value;
 }p[10200];
 int d[4][2]={1,0,-1,0,0,1,0,-1};


 bool cmp(ele x,ele y)
 {
         return x.value<y.value;
 }


 int main()
 {
     int R,C;
     int i,j,k;
     int x,y;
     int mx,my;
     int Max;
     while(scanf("%d%d",&R,&C)!=EOF)
     {
         k=1;
         Max=1;
         for(i=1;i<=R;i++)
             for(j=1;j<=C;j++)
             {
                 scanf("%d",&mat[i][j]);
                 p[k].value=mat[i][j];
                 p[k].x=i;
                 p[k].y=j;
                 k++;
                 dp[i][j]=1;
             }
         sort(p+1,p+k,cmp);
         for(i=1;i<k;i++)
         {
             x=p[i].x;
             y=p[i].y;
             for(j=0;j<4;j++)
             {
                 mx=x+d[j][0];
                 my=y+d[j][1];
                 if(mx>0&&mx<=R&&my>0&&my<=C)
                     if(mat[x][y]>mat[mx][my])
                     {
                         dp[x][y]=max(dp[mx][my]+1,dp[x][y]);
                         Max=max(Max,dp[x][y]);
                     }
             }
         }
         printf("%d\n",Max);
     }
     return 0;
 }