題意: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]++;ios
#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; }