WA on #4,86分
#include <iostream>
#include <cstring>
using namespace std;
int T,W;
int t[1005];
int f[1005][35][5];
int dp(int N,int k,int now){
if(N == T + 1)
return 0;
if(k > W)
return int(-1e9);
if(f[N][k][now] >= 0) return f[N][k][now];
if(now == 1){
int x = 0,y = 0;//x为当前走的最大值,y为不走的最大值
if(t[N] == 1){
x = dp(N + 1,k,1) + 1;
y = dp(N + 1,k + 1,2);
}
else if(t[N] == 2) {
x = dp(N + 1,k,1);
y = dp(N + 1,k + 1,2) + 1;
}
return f[N][k][now] = max(x,y);
}
else if(now == 2){
int x1 = 0,y1 = 0;
if(t[N] == 1){
x1 = dp(N + 1,k + 1,1) + 1;
y1 = dp(N + 1,k,2);
}
else if(t[N] == 2) {
x1 = dp(N + 1,k + 1,1);
y1 = dp(N + 1,k,2) + 1;
}
return f[N][k][now] = max(x1,y1);
}
}
int main(){
memset(f,-2,sizeof f);
cin >> T >> W;
for(int i = 1;i <= T;i++)
cin >> t[i];
cout << dp(1,0,1);
return 0;
}