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

POJ 2385 Apple Catching

2015-08-26 10:44 274 查看
POJ 2385 Apple Catching

大意:牛吃苹果,有两个苹果树,过T分钟,每分钟会有一个苹果树掉苹果,牛可以移动W次,牛开始站在苹果树1下,求T分钟过后牛最多能吃多少个苹果?

DP[i+1][m][z+1]:牛在第i+1分钟时经过m次移动到第z+1树下时吃到的最大苹果树。要根据题目的具体情况对DP数组进行适当设置。

#include<iostream>
#include<algorithm>
using namespace std;
//对数组的适当扩充,防止溢出
int dp[1005][35][2];
int tree[1005];
int move(const int& a)
{
return (a==0?1:0);
}
int main()
{
int T,W;
cin>>T>>W;
//对角标的控制要自己想好
for(int i=0;i<T;i++)
{
int n;
cin>>n;
tree[i+1]=n-1;
}
if(tree[1]==0)
{
dp[1][0][0]=1;
}
else
{
dp[1][1][1]=1;
}
for(int i=1;i<T;i++)
{
for(int m=0;m<=W;m++)
{
for(int z=0;z<2;z++)
{
if(tree[i+1]==z)
{
dp[i+1][m][z]=max(dp[i+1][m][z],dp[i][m][z]+1);
dp[i+1][m+1][move(z)]=max(dp[i+1][m+1][move(z)],dp[i][m][z]);
}
else
{
dp[i+1][m][z]=max(dp[i+1][m][z],dp[i][m][z]);
dp[i+1][m+1][move(z)]=max(dp[i+1][m+1][move(z)],dp[i][m][z]+1);
}
}
}
}
int result=-1;
//对T分钟后的DP数组历遍求最大值
for(j=0;j<=W;j++)
{
for(k=0;k<2;k++)
{
result=max(result,dp[T][j][k]);
}
}
cout<<result<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: