您的位置:首页 > 移动开发

POJ 2385 Apple Catching

2016-03-22 22:47 211 查看
可以设计三维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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: