poj之旅——2385

来源:互联网 发布:office 2016 mac 云盘 编辑:程序博客网 时间:2024/05/14 13:32

题目描述: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 1100using 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[n][0];for (int i=1;i<=w;i++)ans=max(ans,dp[n][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);}}}}



0 0
原创粉丝点击