POJ 2385 Apple Catching

It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree, so she must wait for them to fall. However, she must catch them in the air since the apples bruise when they hit the ground (and no one wants to eat bruised apples). Bessie is a quick eater, so an apple she does catch is eaten in just a few seconds.

Each minute, one of the two apple trees drops an apple. Bessie, having much practice, can catch an apple if she is standing under a tree from which one falls. While Bessie can walk between the two trees quickly (in much less than a minute), she can stand under only one tree at any time. Moreover, cows do not get a lot of exercise, so she is not willing to walk back and forth between the trees endlessly (and thus misses some apples).

Apples fall (one each minute) for T (1 <= T <= 1,000) minutes. Bessie is willing to walk back and forth at most W (1 <= W <= 30) times. Given which tree will drop an apple each minute, determine the maximum number of apples which Bessie can catch. Bessie starts at tree 1.

Input

* Line 1: Two space separated integers: T and W

* Lines 2..T+1: 1 or 2: the tree that will drop an apple each minute.

Output

* Line 1: The maximum number of apples Bessie can catch without walking more than W times.

Sample Input

7 2
2
1
1
2
2
1
1

Sample Output

6

Hint

INPUT DETAILS:

Seven apples fall - one from tree 2, then two in a row from tree 1, then two in a row from tree 2, then two in a row from tree 1. Bessie is willing to walk from one tree to the other twice.

OUTPUT DETAILS:

Bessie can catch six apples by staying under tree 1 until the first two have dropped, then moving to tree 2 for the next two, then returning back to tree 1 for the final two.

设计状态dp[i][j]代表到I时间转换了j次的最大收益,那么状态显然可以由之前的状态转还是不转转移过来,注意加上一段区间的值可以用前缀和来优化。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<stack>
 9 #include<queue>
10 #include<map>
11 #define RG register
12 #define IL inline
13 #define pi acos(-1.0)
14 #define ll long long
15 using namespace std;
16 int tree1[1005],tree2[1005];
17 int dp[1005][35];
18 int T,W;
19 int main() {
20   scanf("%d%d",&T,&W);
21   for(int i=1;i<=T;i++){
22     int type;
23     scanf("%d",&type);
24     if(type==1) tree1[i]=1;
25     else tree2[i]=1;
26     tree1[i]+=tree1[i-1];
27     tree2[i]+=tree2[i-1];
28   }
29   for(int i=1;i<=T;i++)
30     for(int j=0;j<i;j++){
31       for(int w=0;w<=W;w++){
32         if(w%2==0){
33        dp[i][w]=max(dp[i][w],dp[j][w]+tree1[i]-tree1[j]);
34        if(w+1<=W) dp[i][w+1]=max(dp[i][w+1],dp[j][w]+tree2[i]-tree2[j]);
35     } else{
36        dp[i][w]=max(dp[i][w],dp[j][w]+tree2[i]-tree2[j]);
37        if(w+1<=W) dp[i][w+1]=max(dp[i][w+1],dp[j][w]+tree1[i]-tree1[j]);
38     }
39       }
40     }
41   int maxn=0;
42   for(int i=0;i<=W;i++) maxn=max(maxn,dp[T][i]);
43   cout<<maxn;
44   return 0;
45 }
时间: 2024-10-02 17:57:04

POJ 2385 Apple Catching的相关文章

POJ 2385 Apple Catching 接苹果 DP

题目链接:POJ 2385 Apple Catching Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7858   Accepted: 3846 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently number

POJ 2385 Apple Catching(简单DP)

It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree, so she must wait for them to fall.

poj 2385 Apple Catching(dp)

Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree, so she must wait for t

poj 2385 Apple Catching(记录结果再利用的动态规划)

传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有两颗苹果树,在每一时刻只有其中一棵苹果树会掉苹果,而Bessie可以在很短的时间内在两个苹果树间切换,但每一时刻只能切换一下: 求在1~T时刻,Bessie在最多可以切换W次的前提下最多可以获得多少苹果? 题解: 定义变量dp[ i ][ j ] : 前 i 时刻,移动 j 步所获得的最大的苹果数量: 据此写出状态转移方程: 如何判断在i处是否的到苹果呢? ①如果dp[i-1

poj 2385【动态规划】

poj 2385 Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14007   Accepted: 6838 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his

Apple Catching(POJ 2385)

Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9978   Accepted: 4839 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, eac

poj 2385

题目大意:有两颗苹果树,每一秒会有一颗掉落一个苹果(一共n秒),问在限制最多转换(从一颗走到另一颗)m次下最多能得到多少苹果. 分析: dp[i][j][k]表示第i秒转换了j次当前在第k棵树下得到的苹果数最大值 显然只与上一秒的状态有关 dp[i][j][k]=max{dp[i-1][j][k],dp[i-1][j-1][1-k]}+a[i][k] {a[i][k]表示第i秒第k棵树是否有苹果} 那么答案就是max{dp[n][j][k]} 空间上可以优化,可以把第一维拿掉只要保证i是从小到大

BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )

dp dp( x , k ) = max( dp( x - 1 , k - 1 ) + *** , dp( x - 1 , k ) + *** ) *** = 0 or 1 ,根据情况 (BZOJ 1750双倍经验) ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm>

poj 3321 Apple Trie

/* poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题! 可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目 所以我们利用start[i]数组来记录 i 节点在一维数组的起始位置, 而end[i]则是记录i节点所有孩子 节点最后一个孩子节点在数组的位置,那么end[i]-start[i]+1,就是 i 节点(包括自身)和其所有孩子节点的 数目.数组建好了,那么最后就是套用树状数组模板进行求解了! */ #