using
System;
public
class
GFG {
static
int
[, , ] dp =
new
int
[100001, 5, 21];
static
int
recur(
int
i,
int
j,
int
k,
int
[] A,
int
N)
{
if
(i == N) {
return
0;
}
if
(dp[i, j + 1, k] != -1) {
return
dp[i, j + 1, k];
}
int
ans =
int
.MinValue;
if
((k != 0) || (k == 0 && j == 1)) {
ans = Math.Max(
ans,
recur(i + 1, 1, (j == 1) ? k : k - 1, A, N)
+ (A[i] == 1 ? 1 : 0));
}
if
((k != 0) || (k == 0 && j == 2)) {
ans = Math.Max(
ans,
recur(i + 1, 2, (j == 2) ? k : k - 1, A, N)
+ (A[i] == 2 ? 1 : 0));
}
if
((k != 0) || (k == 0 && j == 3)) {
ans = Math.Max(
ans,
recur(i + 1, 3, (j == 3) ? k : k - 1, A, N)
+ (A[i] == 3 ? 1 : 0));
}
return
dp[i, j + 1, k] = ans;
}
static
int
minCost(
int
[] A,
int
N,
int
K)
{
for
(
int
i = 0; i < dp.GetLength(0); i++) {
for
(
int
j = 0; j < dp.GetLength(1); j++) {
for
(
int
l = 0; l < dp.GetLength(2); l++) {
dp[i, j, l] = -1;
}
}
}
return
recur(0, -1, K + 1, A, N);
}
static
public
void
Main()
{
int
[] A = { 1, 1, 2, 1, 3 };
int
K = 1;
int
N = A.Length;
Console.WriteLine(minCost(A, N, K));
int
[] A1 = { 3, 3, 1, 3, 3, 2, 2, 2 };
int
K1 = 0;
int
N1 = A1.Length;
Console.WriteLine(minCost(A1, N1, K1));
}
}