using
System;
class
GFG {
static
int
MinCost(
int
[] arr,
int
N) {
int
[,] dp1 =
new
int
[N + 2, 2];
int
[,] dp2 =
new
int
[N + 2, 2];
for
(
int
i = 1; i <= N; i++) {
if
(arr[i - 1] == 0) {
dp1[i, 0] = Math.Min(dp1[i - 1, 0], dp1[i - 1, 1] + i - 1);
dp1[i, 1] = Math.Min(dp1[i - 1, 1] + 2 * i - 1, dp1[i - 1, 0] + i);
}
else
{
dp1[i, 0] = Math.Min(dp1[i - 1, 0] + 2 * i - 1, dp1[i - 1, 1] + i);
dp1[i, 1] = Math.Min(dp1[i - 1, 1], dp1[i - 1, 0] + i - 1);
}
}
for
(
int
i = N; i > 0; i--) {
if
(arr[i - 1] == 0) {
dp2[i, 0] = Math.Min(dp2[i + 1, 0], dp2[i + 1, 1] + N - i);
dp2[i, 1] = Math.Min(dp2[i + 1, 1] + 2 * (N - i) + 1, dp2[i + 1, 0] + (N - i) + 1);
}
else
{
dp2[i, 0] = Math.Min(dp2[i + 1, 0] + 2 * (N - i) + 1, dp2[i + 1, 1] + (N - i) + 1);
dp2[i, 1] = Math.Min(dp2[i + 1, 1], dp2[i + 1, 0] + N - i);
}
}
int
minCostToMakeArrAllZero =
int
.MaxValue;
int
minCostToMakeArrAllOne =
int
.MaxValue;
for
(
int
i = 0; i <= N; i++) {
minCostToMakeArrAllZero = Math.Min(minCostToMakeArrAllZero, dp1[i, 0] + dp2[i + 1, 0]);
minCostToMakeArrAllOne = Math.Min(minCostToMakeArrAllOne, dp1[i, 1] + dp2[i + 1, 1]);
}
return
Math.Min(minCostToMakeArrAllZero, minCostToMakeArrAllOne);
}
public
static
void
Main(
string
[] args) {
int
N = 6;
int
[] arr = {0, 1, 0, 1, 0, 1};
Console.WriteLine(MinCost(arr, N));
}
}