POJ_2385_Apple_Catching

描述


http://poj.org/problem?id=2385

两棵苹果树,给定一个时间t,1~t每分钟有一棵树掉苹果,牛起始在#1树,最多换w次位置,问最多接到多少苹果.

分析



用f[i][j][k]表示第i分钟,已经移动了j次,在#k树下的最优解.

注意:

1.有些时候动规写成+的形式比-的形式方便

 1 #include<cstdio>
 2 #include<algorithm>
 3 using std :: max;
 4
 5 const int maxt=1005,maxw=35;
 6 int t,w;
 7 int tree[maxt],f[maxt][maxw][3];
 8
 9 inline int move(int x) { return x== 1 ? 2: 1; }
10
11 void solve()
12 {
13     int ans=1;
14     for(int i=1;i<t;i++)
15     {
16         for(int j=0;j<=w;j++)
17         {
18             for(int k=1;k<=2;k++)
19             {
20                 if(k==tree[i+1])
21                 {
22                     f[i+1][j][k]=max(f[i+1][j][k],f[i][j][k]+1);
23                     f[i+1][j+1][move(k)]=max(f[i+1][j+1][move(k)],f[i][j][k]);
24                 }
25                 else
26                 {
27                     f[i+1][j][k]=max(f[i+1][j][k],f[i][j][k]);
28                     f[i+1][j+1][move(k)]=max(f[i+1][j+1][move(k)],f[i][j][k]+1);
29                 }
30             }
31         }
32     }
33     for(int i=1;i<=t;i++)
34     {
35         for(int j=0;j<=w;j++)
36         {
37             for(int k=1;k<=2;k++)
38             {
39                 ans=max(ans,f[i][j][k]);
40             }
41         }
42     }
43     printf("%d\n",ans);
44 }
45
46
47 void init()
48 {
49     scanf("%d%d",&t,&w);
50     for(int i=1;i<=t;i++)
51     {
52         scanf("%d",tree+i);
53     }
54     if(tree[1]==1) f[1][0][1]=1;
55     else f[1][1][2]=1;
56 }
57
58 int main()
59 {
60 #ifndef ONLINE_JUDGE
61     freopen("apple.in","r",stdin);
62     freopen("apple.out","w",stdout);
63 #endif
64     init();
65     solve();
66 #ifndef ONLINE_JUDGE
67     fclose(stdin);
68     fclose(stdout);
69 #endif
70     return 0;
71 }
72     

时间: 2024-10-28 15:01:58

POJ_2385_Apple_Catching的相关文章