POJ 2385 Apple Catching

Apple Catching
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15231   Accepted: 7465

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 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.

Source

 
 

题意有两棵树1,2,掉苹果,人一开始在1下,有指定的移动次数,给苹果下落,求最多接到的苹果数

首先想一想,跟平常的题有什么区别

1.人会移动,

2.苹果要判断是否要不移动接到,还是移动接到

3.移动的次数不像是背包问题里的背包容量越多越好,但和背包问题类似

复制代码
for(int i=1;i<=n;i++)
    {
        dp[i][0]=dp[i-1][0];//第i个苹果,j次移动的最好结果,判断一直不动的情况
        if(t[i]==1) dp[i][0]++;
        
        for(int j=1;j<=w;j++)
        {
            if(j%2+1==t[i]){//判断移动后的位置在哪,如果跟这次下落苹果的位置一样
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+1;//dp的关键,跟上次的东西有关联,接这个苹果我可以选择i-1个苹果移动相同的次数,然后不动接
                                                  //也可以从另一个苹果树移动过来接 } else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]); } }
复制代码

整体代码

复制代码
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int t[1000];
int dp[1000][1000];
int main()
{
    int n,w;
    cin>>n>>w;
    for(int i=1;i<=n;i++)
    {
        cin>>t[i];
    }
    
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        dp[i][0]=dp[i-1][0];
        if(t[i]==1) dp[i][0]++;
        
        for(int j=1;j<=w;j++)
        {
            if(j%2+1==t[i]){
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+1;
            }
            else
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
        }
    }
    cout<<dp[n][w]<<endl;
 } 
复制代码
原文地址:https://www.cnblogs.com/wpbing/p/9507868.html