#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1005][35]; //第i分钟时移动j次获得的苹果树量
int main()
{
int t,w,s[1001];
cin>>t>>w;
for(int i=1;i<=t;i++)
cin>>s[i];
if(s[1]==1)
{
dp[1][0]=1;
dp[1][1]=0;
}
else
{
dp[1][0]=0;
dp[1][1]=1;
}
for(int i = 2 ; i <= t ; i++){
for(int j = 0;j<=w ;j++){
if(j==0)
dp[i][j] = dp[i-1][j] + s[i]%2;
else {
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]);
if(s[i]==((j&1)+1)){
dp[i][j] ++ ;
}
}
}
}
int sum = 0 ;
for(int i =0 ;i<=w;i ++)
sum=max(sum,dp[t][i]);
cout<<sum<<endl;
}
想了想这样写还是要麻烦了
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int t,w,s[1001];
cin>>t>>w;
for(int i=1;i<=t;i++)
cin>>s[i];
int dp[505];
memset(dp, 0, sizeof dp);
for(int i= 1 ;i<= t ;i++)
{
for(int j = 0;j<=w;j++){
if(j==0)
dp[0]+=(s[i]==(j&1)+1);
else{
dp[j]=max(dp[j-1],dp[j]) + (s[i]==(j&1)+1);
}
}
}
int sum = 0;
for(int i= 0;i<=w ;i++)
sum=max(sum,dp[i]);
cout<<sum<<endl;
}