POJ 2385 Apple Catching【DP】
题意:2棵苹果树在T分钟内每分钟随机由某一棵苹果树掉下一个苹果,奶牛站在树#1下等着吃苹果,它最多愿意移动W次,问它最多能吃到几个苹果。
思路:不妨按时间来思考,一给定时刻i,转移次数已知为j, 则它只能由两个状态转移而来。
即上一时刻同一棵树或上一时刻不同的树
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]);
则这一时刻在转移次数为j的情况下最多能接到的苹果为那两个状态的最大值再加上当前能接受到的苹果。(注意当前能否拿到苹果只与转移次数有关)
if (j % 2 + 1 == apple[i])dp[i][j]++;
#include <iostream> #include <cstdio> #include <queue> #include <math.h> #include <string.h> #include <string> #include <algorithm> using namespace std; int dp[1001][31]; int apple[1001]; int main() { int t,w; scanf("%d%d", &t,&w); memset(dp, 0, sizeof(dp)); for(int i=1;i<=t;i++) scanf("%d",apple+i); for(int i=1;i<=t;i++) for(int j=0;j<=w;j++) { if(j == 0)//注意 dp[i][j] = dp[i-1][j]; else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]); if(j%2+1==apple[i])dp[i][j]++; } int ans=0; for(int i=1;i<=t;i++) for(int j=0;j<=w;j++) ans=max(ans,dp[i][j]); printf("%d",ans); return 0; }