此题为动态规划加搜索型题目
采用记忆化搜索的方式
dp[i][j]表示从坐标为 i,j 开始滑所能达到的最长距离
则dp[i][j]=max(dp[i-1][j],dp[i][j+1],dp[i+1][j],dp[i][j-1])
代码如下:

#include<stdio.h> int dir[4][2]= {{0,1},{1,0},{-1,0},{0,-1}}; //初始化偏移量 int dp[105][105]; //dp[x][y]表示从坐标x,y开始滑所达到的最大长度 int map[105][105]; int n,m; int dfs(int x,int y) { if(dp[x][y]) //若已经搜过,返回 return dp[x][y]; int tx,ty,i; for(i=0; i<4; i++) //搜索x,y的上,下,左,右 { tx=x+dir[i][0]; ty=y+dir[i][1]; if(tx>= 0 && tx<n && ty>=0 && ty<m && map[tx][ty]<map[x][y]) //未出界且能往tx,ty滑 { int temp=dfs(tx,ty); //从tx,ty开始滑 if(temp>=dp[x][y]) //若比从x,y开始滑的距离长或相等 { dp[x][y]=temp+1; } } } return dp[x][y]; } int main() { int i,j,t; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0; i<n; i++) for(j=0; j<m; j++) { scanf("%d",&map[i][j]); dp[i][j]=0; } int max=-1; for(i=0; i<n; i++) //将所有地方遍历一遍,找出最大长度 for(j=0; j<m; j++) { t=dfs(i,j); if(t>max) max=t; } //printf("%d ",dp[0][0]); 测试数据dp[0][0]为最低地方 printf("%d ",max+1); //最低的地方dp值为0,所以最后加1 } return 0; }