//目录

DP,得到最多苹果,(POJ2385)

题目链接:http://poj.org/problem?id=2385

题意:

  牛在两棵苹果树下收集苹果,牛只能在这两棵树之间走动w次,在t时刻,某棵树会掉下苹果。

解题报告:

 

///dp[t][w]表示1~t秒内,转w次能够获得的最多苹果数目
///状态转移方程 dp[t][w]=max(dp[t-1][w],dp[t-1][w-1])

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

int main()
{
    int a[1010];  ///a[i]时刻时,苹果落地的位置
    int dp[1010][35];

    int t,w;
    scanf("%d%d",&t,&w);
    for(int i=1;i<=t;i++)
        scanf("%d",&a[i]);

    dp[0][0]=0;
    if(a[1]==1){
        dp[1][0]=1;
        dp[1][1]=0;
    }
    else {
        dp[1][1]=1;
        dp[1][0]=0;
    }

    for(int i=2;i<=t;i++)
    {
        for(int j=0;j<=w;j++)
        {
            if(j==0){
                dp[i][j]=dp[i-1][j]+a[i]%2;
                continue;
            }
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
            if(j%2+1==a[i])
                dp[i][j]++;
        }
    }

    int ans=0;
    for(int i=0;i<=w;i++)
        ans=max(ans,dp[t][i]);

    printf("%d\n",ans);
    return 0;
}

 

posted @ 2016-04-11 18:43  小草的大树梦  阅读(257)  评论(0编辑  收藏  举报