题目链接 :http://bak3.vjudge.net/contest/136499#problem/D
题意:
//转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])
//表示前i秒移动j步能接到的最多苹果数。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std; int dp[][];
int a[]; int main()
{
int T,W;
while(scanf("%d%d",&T,&W)==)
{
for(int i=; i<=T; i++)
scanf("%d",&a[i]);
memset(dp,,sizeof(dp));
int ans;
//初始位置是第一颗树
if(a[]==) //如果给定的第一个位置是第一棵树
{
dp[][]=; //移动到第二个位置,接不到苹果
dp[][]=;//不动,接到一颗苹果
}
if(a[]==)//如果给定的第一个位置是第二棵树
{
dp[][]=;//移动到第二个位置,接到一颗苹果
dp[][]=;//不动,接不到苹果
}
for(int i=; i<=T; i++) //从第二个位置开始循环
{
for(int j=; j<=W; j++)
{
if(j==) //j=0 j-1就越界了
{
if(a[i]==) dp[i][j]=dp[i-][j]+;
continue;
}
else
{
if((a[i]== && j%==)||(a[i]== && j%==)) ans=;
else ans=;
dp[i][j]=max(dp[i-][j],dp[i-][j-])+ans;
}
}
}
int sum=dp[T][];
for(int i=; i<=W; i++)
sum=max(sum,dp[T][i]);
printf("%d\n",sum);
}
return ;
}