题目链接:http://poj.org/problem?id=2385
题意:
牛在两棵苹果树下收集苹果,牛只能在这两棵树之间走动w次,在t时刻,某棵树会掉下苹果。
解题报告:
///dp[t][w]表示1~t秒内,转w次能够获得的最多苹果数目 ///状态转移方程 dp[t][w]=max(dp[t-1][w],dp[t-1][w-1]) #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { int a[1010]; ///a[i]时刻时,苹果落地的位置 int dp[1010][35]; int t,w; scanf("%d%d",&t,&w); for(int i=1;i<=t;i++) scanf("%d",&a[i]); dp[0][0]=0; 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<=t;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=0; for(int i=0;i<=w;i++) ans=max(ans,dp[t][i]); printf("%d\n",ans); return 0; }
时间: 2024-10-25 07:46:01