Apple Catching POJ 2385

 

题意:有两棵苹果树,标号分别为1,2。每分钟有其中的一棵树会掉下一个苹果,奶牛一分钟只能在其中一棵树下接到苹果,但她不知道下一分钟会是那棵树掉下苹果,所以她就要在两棵树下来回跑。但她只会在树下跑W次。问你在T分钟内,奶牛bessie最多能接到多少苹果。

 

题解:一道简单的DP。先给出状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+count。这里的dp[i][j]代表在第i分钟移动j次最多能接到的苹果数。在第i分钟奶牛到某棵树下有两种状态:1.从另一棵树走过来(dp[i-1][j-1])2.本来就呆在这棵树下(dp[i-1][j])。所以在第i分钟时能接到的最大苹果数就是dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+count。这里count的值可以这样计算:如果j为偶数说明她移动了j次又回到了第一棵树下,则count=a[i]==1?1:0;即count=2-a[i]。若j为奇数说明她移动了j次后到了第二棵树下,则count=a[i]==2?1:0(即count=a[i]-1)。

最后初始化,根据上面的状态转移方程以及题意,不难想出吧,具体见下面的代码~

 

AC代码:

 

View Code
 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1005;
 6 int a[N],dp[N][35];
 7 int solve(int T,int W){
 8     int count;
 9     if(T<W)W=T;
10     for(int i=0;i<=W;i++)dp[0][i]=0;
11     for(int i=1;i<=T;i++){
12         dp[i][0]=dp[i-1][0]+2-a[i];
13         for(int j=1;j<=W&&j<=i;j++){
14             if(j%2)count=a[i]-1;
15             else   count=2-a[i];
16             dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+count;
17         }
18     }
19     count=0;
20     for(int i=0;i<=W;i++)
21         if(dp[T][i]>count)
22             count=dp[T][i];
23     return count;
24 }
25 int main()
26 {
27     int T,W;
28     while(scanf("%d %d",&T,&W)!=EOF){
29         for(int i=1;i<=T;i++)
30             scanf("%d",&a[i]);
31         printf("%d\n",solve(T,W));
32     }
33     return 0;
34 }

 

posted on 2012-09-21 11:24  Acmer_Roney  阅读(996)  评论(0编辑  收藏  举报

导航