我是渣渣 我是渣渣  。。。。记忆化搜索   看了学长的代码 和算法竞赛入门经典这本书才勉勉强强看懂点。。。
#include <stdio.h>
#include <string.h>
int dir[4][2]={1,0,-1,0,0,1,0,-1};//方向
int dp[101][101],map[101][101];//dp[x][y]保存记忆。。。
int m,n;
int max(int x,int y)
{
return x>y?x:y;
}
bool limit(int x,int y)//是否出界
{
if(x<0||y<0||x==m||y==n)
return false;
return true;
}
int dfs(int x,int y)
{
if(dp[x][y]!=0) return dp[x][y];
for(int i=0;i<4;i++)
{
int x_i=x+dir[i][0];
int y_i=y+dir[i][1];
if(limit(x_i,y_i)&&map[x][y]>map[x_i][y_i]&&dp[x][y]<dfs(x_i,y_i)+1)
dp[x][y]=dp[x_i][y_i]+1;
}
return dp[x][y];
}
int main()
{

while(scanf("%d %d",&m,&n)!=EOF){
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
int num=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
num=max(num,dfs(i,j));
}
printf("%d\n",num+1);
}
return 0;
}