poj 1088 滑雪

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 38510 Accepted: 13594

本题是简单的DP问题,一开始的时候我用的是深搜的方法,但是发现很容易超时,所以用DP只用了0ms

   思路:对每一个点进行搜索,然后用一个数组来保存每个点搜索到得最佳结果,当下一次搜索时如果此数组并非初始值就可直接调用。最后求出最大的那一个便是我们想要的结果

代码:

 

  
    
1 #include < stdio.h >
2 #include < string .h >
3   int b[ 4 ][ 2 ] = {{ 1 , 0 },{ - 1 , 0 },{ 0 , 1 },{ 0 , - 1 }}; int a[ 105 ][ 105 ],r,c; int d[ 105 ][ 105 ];
4   int test( int x, int y)
5 {
6 int i,s;
7 int count = 0 ;
8 if (d[y][x] > 0 )
9 return d[y][x];
10 for (i = 0 ;i <= 3 ;i ++ )
11 if (a[y + b[i][ 1 ]][x + b[i][ 0 ]] < a[y][x] && (x + b[i][ 0 ]) >= 1 && (x + b[i][ 0 ]) <= c && (y + b[i][ 1 ]) >= 1 && (y + b[i][ 1 ]) <= r)
12 {
13 s = test(x + b[i][ 0 ],y + b[i][ 1 ]);
14 if (s > count)
15 count = s;
16 }
17 d[y][x] = count + 1 ;
18 return count + 1 ;
19
20
21 }
22   int main()
23 {
24 int i,j,max,s;
25 scanf( " %d%d " , & r, & c);
26 memset(d, 0 , sizeof (d[ 0 ]));
27 max = 0 ;
28 for (i = 1 ;i <= r;i ++ )
29 for (j = 1 ;j <= c;j ++ )
30 {
31 scanf( " %d " , & a[i][j]);
32 }
33 for (i = 1 ;i <= r;i ++ )
34 for (j = 1 ;j <= c;j ++ )
35 {
36
37 s = test(j,i);
38 if (s > max)
39 {
40 max = s;
41 }
42 }
43 printf( " %d\n " ,max);
44
45 return 0 ;
46 }
47  

 

 

 

你可能感兴趣的:(poj)