zoukankan      html  css  js  c++  java
  • poj 2385 Apple Catching dp

    http://poj.org/problem?

    id=2385


    题意:有两棵苹果树,每分钟都会有一棵树上会掉下来一个苹果。你必需要站在这棵树下才干接到这棵树掉下来的苹果,你能够在两棵树之间来回走动。并且不花费时间,可是来回走的次数不超过w次。如今告诉你每分钟从哪棵树上会掉下来苹果。问你最多能接着多少个。你的起始位置是在第一棵树下。

    思路:用dp[i][j][k]表示第i分钟,已经来回走了j次,并且如今在第k棵树下(k=0表示在第一棵树下。k=1表示在第二棵树下),能接到的最多的苹果数量,那么假设第i分钟,是第一课树掉下苹果,那么easy想到dp[i]][j][0]=max(dp[i-1][j][0]+1,dp[i-1][j-1][1]+1)。由于可能之前就在第一棵树下,那么就不须要走动。就能够再接一个苹果,或者之前在第二棵树下,那么就要移动一次才干到第一棵树下,再接一个苹果;dp[i][j][1]=dp[i-1][j][1],以为依据贪心的思想,不可能知道第一棵树要落下苹果,还从第一棵树下走到第二棵树下,所以k=1的情况仅仅有由dp[i-1][j][1]推出。那么同理,我们能够得到第i分钟,是第二棵树掉下苹果的情况了。这里就不再叙述了。假设不明确,就看以下的代码好了。须要注意的是。最后的答案不一定是移动了最大次数的情况。比方所有都是第一棵苹果树在掉苹果,那么不用移动就能够接到最多的苹果,所以,必须要要在所有的情况中找最大值。


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    int dp[1010][35][2];
    int a[1010];
    
    int main()
    {
        int n,m;
        while(cin>>n>>m){
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
                cin>>a[i];
            for(int i=1;i<=n;i++){
                for(int j=0;j<=m;j++) if(j<=i){
                    if(a[i]==1){
                        if(j)
                            dp[i][j][0]=max(dp[i-1][j][0]+1,dp[i-1][j-1][1]+1);
                        else dp[i][j][0]=dp[i-1][j][0]+1;
                        dp[i][j][1]=dp[i-1][j][1];
                    }
                    else{
                        dp[i][j][0]=dp[i-1][j][0];
                        if(j)
                            dp[i][j][1]=max(dp[i-1][j][1]+1,dp[i-1][j-1][0]+1);
                        else dp[i][j][1]=dp[i-1][j][1]+1;
                    }
                }
            }
            int ans=0;
            for(int i=0;i<=m;i++){
                ans=max(ans,dp[n][i][0]);
                ans=max(ans,dp[n][i][1]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    





  • 相关阅读:
    python 之 Multiprocessing 多进程
    python 之 Threading 多线程
    Python实战 -- 利用Flask搭建微电影网站(一)蓝图构建
    R语言学习——作图
    python 之 pandas 总结
    python 之 numpy 总结
    C++使用Jsoncpp源码
    C++左值、左值引用、右值、右值引用
    std::forward
    std::move
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6994984.html
Copyright © 2011-2022 走看看