思路是 设dp[i][j][k] 前i个数有j个偶数第i个数为奇数 或者 偶数
#include<iostream>
#include<cstring>
using namespace std;
const int N = 110;
int a[N];
int dp[N][N][2];
//dp[i][j][0]前i个数有j个偶数 第 i个为偶
int main(){
memset(dp,0x3f,sizeof dp);
int n;
cin >> n;
int c0 = 0;
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
dp[0][0][0] = 0,dp[0][0][1] = 0;
for(int i = 1; i <= n; i++){
for(int j = 0; j < i; j++){
if(a[i]){
if(a[i] % 2 == 0){
dp[i][j + 1][0] = min(dp[i - 1][j][0],dp[i - 1][j][1] + 1);
}else{
dp[i][j][1] = min(dp[i - 1][j][0] + 1,dp[i - 1][j][1]);
}
}else{
dp[i][j + 1][0] = min(dp[i - 1][j][0],dp[i - 1][j][1] + 1);
dp[i][j][1] = min(dp[i - 1][j][0] + 1,dp[i - 1][j][1]);
}
}
}
cout << min(dp[n][n / 2][0],dp[n][n / 2][1]);
return 0;
}