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) 编辑 收藏 举报