您的位置:首页 > 其它

poj之旅——2385

2016-05-16 21:42 288 查看
题目描述:2棵苹果树在T分钟内随机由某一棵苹果树掉下一个苹果,奶牛站在树#1下等

着吃苹果,它最多愿意移动W次,问它最多能吃到几个苹果。

题解:这道题我定义

dp状态方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])

dp[i][j]标示在时间i,已经来回了j次时的最大苹果数目。
      如果当前的次数刚到当前树下,dp[i][j]++;
参考程序:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 1100
using namespace std;
int dp[maxn][35];
int a[maxn];
int main(){
int n,w;
while (scanf("%d %d",&n,&w)==2){
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++)scanf("%d",&a[i]);
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<=n;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=dp
[0];
for (int i=1;i<=w;i++)
ans=max(ans,dp
[i]);
printf("%d",ans);
}
return 0;
}

另外,还可以定义dp[x][y][z]表示第x + 1分的时候经过y次移动站在了z+1树下能吃到的最大苹果数,然后搜索所有的xyz组合,更新dp。
给出代码段:

for (int i = 0; i < T - 1; ++i)
{
for (int j = 0; j <= W; ++j)
{
for (int k = 0; k < 2; ++k)
{
if (k == tree[i + 1])
{
// 下一个苹果掉在当前树下,那么下一分钟?
// 站着不动吃一个
dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);
// 移动没吃到,不变
dp[i + 1][j + 1][move(k)] = max(dp[i + 1][j + 1][move(k)], dp[i][j][k]);
}
else
{
// 下一个苹果掉在另一树下,那么下一分钟?
// 站着不动没吃到
dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);
// 移动吃一个
dp[i + 1][j + 1][move(k)] = max(dp[i + 1][j + 1][move(k)], dp[i][j][k] + 1);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: