永夜初晗凝碧天

本博客现已全部转移到新地址,欲获取更多精彩文章,请访问http://acshiryu.github.io/

导航

poj1088记忆化搜索

滑雪
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 50251 Accepted: 18250

Description

Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 
 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

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=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
就是从各点进行搜索,并用以数组记录搜索的结果,一遍下次搜索该处时再用
然后遍历一下该数组,找到最大的一个元素

http://www.cnblogs.com/ACShiryu

参考代码:

 1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int map[105][105];
5 int f[][2]={{1,0},{0,1},{-1,0},{0,-1}};
6 int vis[105][105] ;
7 int m , n ;
8 int DFS ( int x , int y )
9 {
10 if ( vis[x][y] != -1 )
11 return vis[x][y] ;
12 int i ;
13 int sum = 1 ;
14 for ( i = 0 ; i < 4 ; i ++ )
15 {
16 int s = x + f[i][0] ;
17 int t = y + f[i][1] ;
18 if ( s < 0 || t < 0 || s >= m || t >= n )
19 continue;
20 if ( map[s][t] >= map[x][y] )
21 continue;
22 sum = max ( sum , DFS ( s , t ) + 1 ) ;
23 }
24 vis[x][y] = sum ;
25 return sum ;
26 }
27 int main()
28 {
29 while ( cin >> m >> n )
30 {
31 int sum = 0;
32 int i , j ;
33 for ( i = 0 ; i < m ; i ++ )
34 for ( j = 0 ; j < n ; j ++ )
35 cin >> map [i][j] ;
36 memset ( vis , -1 , sizeof ( vis ) ) ;
37 for ( i = 0 ; i < m ; i ++ )
38 for ( j = 0 ; j < n ; j ++ )
39 sum = max ( sum , DFS ( i , j ) ) ;
40 cout << sum << endl ;
41 }
42 return 0 ;
43 }

posted on 2011-08-14 00:12  ACShiryu  阅读(1498)  评论(0编辑  收藏  举报