RQNOJ 317 :: 滑雪

记忆化DFS

 

在矩阵中找一条最长的下降序列

 

 

MyCode
1 #include <stdio.h>
2 #include <string.h>
3
4  #define max(a,b) ((a)>(b)?(a):(b))
5
6  long dp[110][110], r, c, map[110][110], ans;
7  const long dx[4] = { 1, -1, 0, 0 },
8 dy[4] = { 0, 0, 1, -1 };
9
10 long solve ( long x, long y ){
11 if ( dp[x][y] )
12 return dp[x][y];
13 /*记忆化的关键*/
14 long newx, newy, i;
15 for ( i = 0; i < 4; i ++ ){
16
17 newx = x + dx[i];
18 newy = y + dy[i];
19
20 if ( newx>=0 && newx<r && newy>=0 && newy<c
21 && map[newx][newy] < map[x][y] ){
22 dp[x][y] = max ( solve(newx, newy)+1, dp[x][y] );
23 /*
24 从四周引申来+1的序列长度是否大于现有的长度
25 可以参考各种最大不降不升下降上升子序列理解
26 */
27 }
28 /*
29 一开始忘记我的下标是从0开始了,写成newx<=r, newy<=c
30 结果有一个点很纠结没过。。居然被咱调试出来了,伟大~
31 */
32 }
33 return dp[x][y];
34 }
35
36 int main(){
37
38 long i, j;
39
40 ans = -1;
41
42 scanf ( "%ld%ld", &r, &c );
43 getchar();
44 for ( i = 0; i < r; i ++ )
45 for ( j = 0; j < c; j ++ )
46 scanf ( "%ld", &map[i][j] );
47
48 for ( i = 0; i < r; i ++ )
49 for ( j = 0; j < c; j ++ ){
50 dp[i][j] = solve ( i, j );
51 ans = max ( dp[i][j], ans );
52 }
53
54 printf ( "%ld\n", ans+1 );
55 /*+1是因为最少也有一个序列长度为1 ,即自身*/
56
57 getchar(), getchar();
58 return 0;
59 }
60

 

 

posted on 2010-11-07 20:53  Jasper Ho  阅读(212)  评论(0编辑  收藏  举报

导航