dp
f [ i ][ j ][ k ]表示第i分,移动了j次,在第k棵树下。
#include<stdio.h>
#include<algorithm>
using namespace std;
#define inf 1500
int t,w;
int a[2][inf];
int f[inf][50][2];
int main()
{
scanf("%d %d",&t,&w);
for(int i=1;i<=t;i++)
{
int x;
scanf("%d",&x);
if(x==1)
{
a[0][i]=1;
}else
{
a[1][i]=1;
}
}
f[1][0][0]=a[0][1];
f[1][1][1]=a[1][1];
for(int i=2;i<=t;i++)
{
for(int j=0;j<=w;j++)//注意从0开始,卡了我好几次。。。
{
for(int k=0;k<=1;k++)
{
f[i][j][k]=max(f[i-1][j][k],f[i-1][j-1][1-k])+a[k][i];
}
}
}
int ans=0;
for(int i=0;i<=w;i++)
{
ans=max(ans,max(f[t][i][0],f[t][i][1]));
}
printf("%d",ans);
}