C - Garland
狂开数组两维不行上三维
#include "stdio.h"
#include "cstdio"
#include "iostream"
#include "algorithm"
#include "map"
#include "string.h"
#include "cstring"
#include "set"
using namespace std;
int n, p[110], mem[110][110][2];
int minn(int pos, int odd, int even, int last_p)
{
if(pos > n)
return 0;
if(mem[pos][odd][last_p] != -1)
{
return mem[pos][odd][last_p];
}
int ret;
if(p[pos]){
ret = minn(pos+1, odd, even, p[pos]%2);
if(last_p != p[pos]%2) ret++;
} else {
int E = n, O = n;
if(even){
E = minn(pos+1, odd, even-1, 0);
if(last_p) E++;
}
if(odd){
O = minn(pos+1, odd-1, even, 1);
if(!last_p) O++;
}
ret = min(E, O);
}
return mem[pos][odd][last_p] = ret;
}
int main(){
while(scanf("%d", &n) > 0){
set<int> present;
for(int i=1; i<=n; i++){
scanf("%d", &p[i]);
present.insert(p[i]);
}
int odds = 0, evens = 0;
for(int i=1; i<=n; i++){
if(!present.count(i)){
if(i & 1) odds++;
else evens++;
}
}
memset(mem, -1, sizeof mem);
printf("%d\n", min(minn(1, odds, evens, 0), minn(1, odds, evens, 1)));
}
}