_xiaobai_

导航

zoj3310 Unrequited Love (DP)

/*
 不错的题目:如果没有首尾相连的话,这个题目就很简单了:
      动态方程:F( n ) = max( F[ n-1 ], F[ n-2 ] +D[ n ] )
    题目分析:  现在告诉我们首尾相连,为了无后效性,我们要把环拆开。
            我们把起始时分为两种状况,取或不取,当取第一个元素时,我们DP到n-1位置;当不取第一个元素时,我们DP到n位置。
   时间复杂性:O(n)
*/

View Code
 1 #include <stdio.h>
2 #include <string.h>
3
4 int D[ 1000002 ];
5 int F[ 1000002 ];
6 int G[ 1000002 ];
7
8 int main()
9 {
10 int n;
11 while ( ~scanf("%d",&n) ) {
12 for ( int i = 1 ; i <= n ; ++ i )
13 scanf("%d",&D[ i ]);
14
15 /* 当选择第一个数字时 */
16 memset( F, 0, sizeof( F ) );
17 F[ 1 ] = D[ 1 ];
18 for ( int i = 2 ; i <= n ; ++ i ) {
19 F[ i ] = F[ i-2 ] + D[ i ];
20 if ( F[ i ] < F[ i-1 ] )
21 F[ i ] = F[ i-1 ];
22 }
23
24 int Max = F[ n-1 ];
25
26 /* 当不选择第一个数字时 */
27 memset( G, 0, sizeof( F ) );
28 for ( int i = 2 ; i <= n ; ++ i ) {
29 G[ i ] = G[ i-2 ] + D[ i ];
30 if ( G[ i ] < G[ i-1 ] )
31 G[ i ] = G[ i-1 ];
32 }
33
34 if ( Max < G[ n ] )
35 Max = G[ n ];
36
37 printf("%d\n",Max);
38 }
39 return 0;
40 }

posted on 2011-08-18 12:50  _xiaobai_  阅读(377)  评论(0编辑  收藏  举报