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;
}