POJ 2385 Apple Catching

 可以设计三维DP,dp[i][j][k]表示i秒的时候,走了j步,在编号为k的树下获得的最大价值。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int T,W;
int dp[1200][40][3];
int a[2000];
int ans;

void read()
{
    for(int i=1;i<=T;i++) scanf("%d",&a[i]);
}

void init()
{
    memset(a,-1,sizeof a);
    memset(dp,-1,sizeof dp);
    ans=0;
}

void work()
{
    if(a[1]==1) dp[1][0][1]=1,dp[1][1][2]=0,ans=1;
    else dp[1][0][1]=0,dp[1][1][2]=1,ans=1;


    for(int i=1;i<=T;i++)
    {
        for(int j=0;j<=W;j++)
        {
            ans=max(ans,dp[i][j][1]);
            ans=max(ans,dp[i][j][2]);
            if(dp[i][j][1]!=-1)
            {
                //原地不动
                if(a[i+1]==1) dp[i+1][j][1]=max(dp[i+1][j][1],dp[i][j][1]+1);
                else dp[i+1][j][1]=max(dp[i+1][j][1],dp[i][j][1]);

                //移动到2
                if(a[i+1]==2) dp[i+1][j+1][2]=max(dp[i+1][j+1][2],dp[i][j][1]+1);
                else dp[i+1][j+1][2]=max(dp[i+1][j+1][2],dp[i][j][1]);
            }
            if(dp[i][j][2]!=-1)
            {
                //原地不动
                if(a[i+1]==2) dp[i+1][j][2]=max(dp[i+1][j][2],dp[i][j][2]+1);
                else dp[i+1][j][2]=max(dp[i+1][j][2],dp[i][j][2]);

                //移动到1
                if(a[i+1]==1) dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][2]+1);
                else dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][2]);
            }
        }
    }
    printf("%d\n",ans);
}

int main()
{
    while(~scanf("%d%d",&T,&W))
    {
        init();
        read();
        work();
    }
    return 0;
}

 

posted @ 2016-03-22 22:47  Fighting_Heart  阅读(273)  评论(0编辑  收藏  举报