• 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;
     } 
    复制代码
  • 相关阅读:
    G++ 中文使用教程[转]
    PreparedStatement是如何大幅度提高性能的[转]
    .net 2.0(c#)下简单的FTP应用程序
    Remoting服务集成到IIS的简单总结
    转:xml一些知识
    [翻译]简单谈谈事件与委托 (转)
    觉得不错
    winform的一些知识
    xml 基本语法
    简单的信息采集程序示例(小偷程序) (转)
  • 原文地址:https://www.cnblogs.com/wpbing/p/9507868.html
Copyright © 2020-2023  润新知