Codeforces Round #612 (Div. 2) C - Garland (DP思想)

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)));
      }
    }

发布了289 篇原创文章 · 获赞 112 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/king9666/article/details/103922064