fi,j,1/2表示在第i时刻移动过j次在第1或2树下能接到最大的苹果数量.
#include<bits/stdc++.h>
using namespace std;
int t,w,down[1001],f[1001][31][2];
int main()
{
cin>>t>>w;
for(int i=1;i<=t;i++) cin>>down[i];
memset(f,-1e6,sizeof(f));
for(int j=0;j<=w;j++)
{
f[0][j][1]=0;
f[0][j][2]=0;
}
for(int i=1;i<=t;i++)
for(int j=1;j<=w;j++)
{
if(down[i]==1)
{
f[i][j][1]=max(f[i][j][1],max(f[i-1][j][1],f[i-1][j-1][2])+1);
f[i][j][2]=max(f[i][j][2],max(f[i-1][j][2],f[i-1][j-1][1]));
}
else
{
f[i][j][2]=max(f[i][j][2],max(f[i-1][j][2],f[i-1][j-1][1])+1);
f[i][j][1]=max(f[i][j][1],max(f[i-1][j][1],f[i-1][j-1][2]));
}
}
int ans=-1e6;
for(int j=1;j<=w;j++)
{
int tmp=max(f[t][j][1],f[t][j][2]);
if(tmp>ans) ans=tmp;
}
cout<<ans;
return 0;
}