标签:
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
Input
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
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 int c,r; 4 int zf[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 5 int snow[110][110]; 6 int D[110][110]; 7 int dfs(int x,int y){ 8 if(D[x][y]!=0){ 9 return D[x][y]; 10 } 11 int maxx=1,x1,y1,kk; 12 for(int i=0;i<4;i++){ 13 x1=x+zf[i][0]; 14 y1=y+zf[i][1]; 15 if(x1 >= 0 && x1 < r && y1 >= 0 && y1 < c && snow[x][y] > snow[x1][y1]){ 16 kk=dfs(x1,y1)+1; 17 if(kk>maxx){ 18 maxx=kk; 19 } 20 } 21 } 22 return maxx; 23 } 24 int main() 25 { 26 int ans=0; 27 scanf("%d %d",&r,&c); 28 for(int i=0;i<r;i++){ 29 for(int j=0;j<c;j++){ 30 scanf("%d",&snow[i][j]); 31 } 32 } 33 memset(D,0,sizeof(D)); 34 for(int i=0;i<r;i++){ 35 for(int j=0;j<c;j++){ 36 D[i][j]=dfs(i,j); 37 if(D[i][j] > ans){ 38 ans = D[i][j]; 39 } 40 } 41 } 42 printf("%d\n",ans); 43 44 return 0; 45 }
思路解析:
我真的要哭了!这题9点写完的。检查到10点。然后又找安安和爽老板帮我看。结果最后是主函数的i++写成了r++!!!我去年买了个表啊!!
咳咳,言归正传,这题用记忆型DP,D数组储存的是在某个点的最大高度。所以在DFS函数最前面来判断,这样调用直接节省了很多时间,不会超时。然后再利用DFS深搜,搜到答案返回,更新最大值,搜到最后,输出最大值,大功告成。
标签:
原文地址:http://www.cnblogs.com/xzt6/p/5751286.html