题目大意:一个人在一个滑坡区域内滑雪,只能向下斜坡滑,问最长滑坡的长度
输入:区域行数R 区域列数C(1 <= R,C <= 100)
二维数组R*C(每个数字代表点的高度h)(0<=h<=10000)
输出:最长滑坡的长度
分析:dfs+记忆化(这道题dp也可以,其实思路都一样)
从每一个点出发,dfs所能到达的最远路径,从这些点中选出长度最长的。区域中最矮的点,长度肯定为1。
代码:转载自https://www.cnblogs.com/pushing-my-way/archive/2012/07/22/2603465.html
1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=101; 7 int array[maxnum][maxnum]; 8 int res[maxnum][maxnum]; 9 int r,c; 10 int lx[4]={-1,1,0,0}; 11 int ly[4]={0,0,-1,1}; 12 13 bool judge(int x,int y) 14 { 15 if(x>=1 && x<=r && y>=1 && y<=c) 16 return true; 17 else return false; 18 } 19 20 int dfs(int x,int y) 21 { 22 if(res[x][y]!=0) return res[x][y]; 23 int i; 24 int big=0; 25 for(i=0;i<4;i++) 26 if(judge(x+lx[i],y+ly[i]) && array[x+lx[i]][y+ly[i]]<array[x][y]) 27 { 28 res[x+lx[i]][y+ly[i]]=dfs(x+lx[i],y+ly[i]); 29 if(big<res[x+lx[i]][y+ly[i]]) 30 big=res[x+lx[i]][y+ly[i]]; 31 } 32 if(big>0) return big+1; 33 return 1; //big==0 表示走到死胡同里了。 34 //return 0 表示各个点中到最小点的距离。 35 } 36 37 int main() 38 { 39 scanf("%d%d",&r,&c); 40 int i,j; 41 int small,si,sj; 42 small=10005; 43 memset(res,0,sizeof(res)); 44 memset(array,0,sizeof(array)); 45 for(i=1;i<=r;i++) 46 for(j=1;j<=c;j++) 47 { 48 scanf("%d",&array[i][j]); 49 if(array[i][j]<small) 50 { 51 small=array[i][j]; 52 si=i; 53 sj=j; 54 } 55 } 56 57 res[si][sj]=1; 58 for(i=1;i<=r;i++) 59 for(j=1;j<=c;j++) 60 res[i][j]=dfs(i,j); 61 62 int ans=0; 63 for(i=1;i<=r;i++) 64 for(j=1;j<=c;j++) 65 if(res[i][j]>ans) 66 ans=res[i][j]; 67 printf("%d\n",ans); 68 return 0; 69 }