滑雪
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 587 Solved: 219
Description
小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二位数组给出。数组的每个数字代表点的高度。下面是一个例子:
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减少,在上面的例子中,一条可行的滑坡为25 24 17 16 1(从25开始到1结束),当然25 24 23 22... 2 1更长,事实上是最长的一条。
Input
多个测试数据。每组测试数据第一行为表示区域的数组的行数R和列数C( 1 <= R ,C <= 100) 下面是R行,每行有C个数代表高度(不超过10000)。
Output
输出区域中最长的滑坡长度。
Sample Input
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Sample Output
25
WA:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #define INF -1 3 int R,C; 4 int Ski_area[200][200]; 5 int dp[200][200]; 6 int maxn; 7 8 int max(int a,int b) 9 { 10 return a>b?a:b; 11 } 12 13 void ski_high(int x,int y,int *length) 14 { 15 int j,k,m[4]; 16 m[0]=Ski_area[x-1][y],m[1]=Ski_area[x][y-1],m[2]=Ski_area[x+1][y],m[3]=Ski_area[x][y+1]; 17 18 k=-1; 19 for(j=0;j<4;j++) 20 { 21 if(Ski_area[x][y]<m[j]) 22 { 23 if(k==-1) 24 { 25 k=j; 26 } 27 else 28 { 29 if(m[k]>m[j]) 30 k=j; 31 } 32 } 33 34 } 35 if(k==-1) 36 return; 37 ++(*length); 38 if(k==0) 39 ski_high(x-1,y,length); 40 else if(k==1) 41 ski_high(x,y-1,length); 42 else if(k==2) 43 ski_high(x+1,y,length); 44 else 45 ski_high(x,y+1,length); 46 } 47 48 int main() 49 { 50 freopen("a.txt","r",stdin); 51 int i,j,k; 52 while(scanf("%d%d",&R,&C)==2) 53 { 54 for(i=1;i<=R;i++) 55 for(j=1;j<=C;j++) 56 { 57 scanf("%d",&Ski_area[i][j]); 58 } 59 60 for(i=0;i<=R;i++) 61 { 62 Ski_area[i][0]=INF; 63 } 64 65 for(i=0;i<=C;i++) 66 { 67 Ski_area[0][i]=INF; 68 } 69 70 71 maxn=1; 72 for(i=1;i<=R;i++) 73 for(j=1;j<=C;j++) 74 { 75 k=1; 76 ski_high(i,j,&k); 77 dp[i][j]=k; 78 79 maxn=max(maxn,dp[i][j]); 80 } 81 /* for(i=1;i<=R;i++) 82 { 83 printf(" "); 84 for(j=1;j<=C;j++) 85 printf("%-4d",dp[i][j]); 86 }*/ 87 printf("%d ",maxn); 88 } 89 return 0; 90 }
AC版:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 3 int dp[100][100]; 4 int arr[100][100]; 5 int R,C; 6 7 int getHigh(int i,int j) 8 { 9 if(dp[i][j]>1) 10 { 11 return dp[i][j]; 12 } 13 int max=1; 14 if(arr[i][j]>arr[i][j-1]&&j-1>=0) 15 { 16 int h=getHigh(i,j-1)+1; 17 if(h>max) 18 { 19 max=h; 20 } 21 } 22 if(arr[i][j]>arr[i][j+1]&&j+1<C) 23 { 24 int h=getHigh(i,j+1)+1; 25 if(h>max) 26 { 27 max=h; 28 } 29 } 30 if(arr[i][j]>arr[i-1][j]&&i-1>=0) 31 { 32 int h=getHigh(i-1,j)+1; 33 if(h>max) 34 { 35 max=h; 36 } 37 } 38 if(arr[i][j]>arr[i+1][j]&&i+1<R) 39 { 40 int h=getHigh(i+1,j)+1; 41 if(h>max) 42 { 43 max=h; 44 } 45 } 46 return max; 47 } 48 49 int main() 50 { 51 //freopen("a.txt","r",stdin); 52 int i,j; 53 while(scanf("%d%d",&R,&C)!=EOF) 54 { 55 for(i=0;i<R;i++) 56 { 57 for(j=0;j<C;j++) 58 { 59 scanf("%d",&arr[i][j]); 60 dp[i][j]=1; 61 } 62 } 63 int res=0; 64 for(i=0;i<R;i++) 65 { 66 for(j=0;j<C;j++) 67 { 68 dp[i][j]=getHigh(i,j); 69 if(dp[i][j]>res) 70 { 71 res=dp[i][j]; 72 } 73 } 74 } 75 printf("%d ",res); 76 } 77 return 0; 78 }