dp状态方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])
dp[i][j]标示在时间i,已经来回了j次时的最大苹果数目。
dp方程肯定苹果数目不会变的,所以要注意,如果当前的次数刚到当前树下,dp[i][j]++;
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <malloc.h>
using namespace std;
int dp[1010][40];
int a[1010];
int main ()
{
int t,n;
while(cin>>t>>n)
{
for (int i=1;i<=t;i++)
{
cin>>a[i];
}
if (a[1]==1)
{
dp[1][1]=0;
dp[1][0]=1;
}
else if (a[1]==2)
{
dp[1][1]=1;
dp[1][0]=0;
}
for (int i=2;i<=t;i++)
for (int j=0;j<=n;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=-100;
for (int i=1;i<=n;i++)//寻找最值
{
if (ans < dp[t][i])
ans = dp[t][i];
}
cout<<ans<<endl;
}
return 0;
}