动态规划题。
题目大意:给定一个二维数组,数组中每个数代表一个高度,每次只能向相邻且高度下降的方向移动,求最长的移动距离。
View Code
1 #include <stdio.h> 2 #include <memory.h> 3 #define MAX(a,b) ((a)>(b)?(a):(b)) 4 #define N 100 5 int dx[4]={0,0,1,-1}; 6 int dy[4]={1,-1,0,0}; 7 int h[N][N],n,m; 8 int c[N][N]; 9 int dp(int i,int j) 10 { 11 int ni,nj,d; 12 if(c[i][j]) return c[i][j]; 13 c[i][j]=1; 14 for(d=0;d<4;d++) 15 { 16 ni=i+dx[d],nj=j+dy[d]; 17 if(ni<0 || nj<0 || ni>=n || nj>=m || h[ni][nj]>=h[i][j]) continue; 18 c[i][j]=MAX(c[i][j],dp(ni,nj)+1); 19 } 20 return c[i][j]; 21 } 22 int main() 23 { 24 int i,j,ans; 25 while(~scanf("%d%d",&n,&m)) 26 { 27 for(i=0;i<n;i++) 28 { 29 for(j=0;j<m;j++) scanf("%d",&h[i][j]); 30 } 31 ans=1; 32 for(i=0;i<n;i++) 33 { 34 for(j=0;j<m;j++) ans=MAX(ans,dp(i,j)); 35 } 36 printf("%d\n",ans); 37 memset(c,0,sizeof(c)); 38 } 39 return 0; 40 }