dp(i, j, k)表示
处在时间i, 当前位置是j, 还有k次变换机会所能取到的最多苹果
状态转移公式为
dp(i, j, k) = max(dp(i + 1, !j, k - 1), dp(i + 1, j, k)) + ((j + 1) == t[i])
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define MAX_N 1005
#define mod 1000000000
using namespace std;
int T, W;
int t[MAX_N], dp[MAX_N][2][35];
int DP(int i, int j, int k)
{
if (i == T)
return (j + 1) == t[i];
else if (dp[i][j][k])
return dp[i][j][k];
else if (k)
return dp[i][j][k] = max(DP(i + 1, !j, k - 1), DP(i + 1, j, k)) + ((j + 1) == t[i]);
else
return dp[i][j][k] = DP(i + 1, j, k) + ((j + 1) == t[i]);
}
int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d%d", &T, &W);
for (int i = 1; i <= T; i++)
scanf("%d", &t[i]);
memset(dp, 0, sizeof(dp));
int ans;
if (W)
ans = max(DP(1, 0, W), DP(1, 1, W - 1));
else
ans = DP(1, 0, W);
printf("%d\n", ans);
return 0;
}