zoukankan      html  css  js  c++  java
  • C. Garland

    http://codeforces.com/contest/1287/problem/C

    思路:

    dp[k][h][w][z] 表示剩余0-k节点,基数点剩余h个,偶数点剩余w个,k点为z(奇/偶) 的情况下的最优值。

    其中w可以省略掉因为可以根据k和h计算出w,为了方便写计算留下了w。

    代码:

    #include <iostream>
    #include <string>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <map>
     
    using namespace std;
     
    const int N = 101;
    int a[N];
    int dp[N][N][N][2];
    int n;
    int dfs(int k, int h, int w, int z)
    {
        if (dp[k][h][w][z] != -1)
        {
            return dp[k][h][w][z];
        }
        if (k == 0)
        {
            if ((z == 1 && (a[k] == 0 || a[k]&0x01)) && h > 0)
            return (dp[k][h][w][z] = 0);
            if ((z == 0 && (a[k] == 0 || !(a[k]&0x01))) && w > 0)
                return (dp[k][h][w][z] = 0);
            return (dp[k][h][w][z] = N);
        }
        dp[k][h][w][z] = N;
        if(a[k] == 0)
        {
            if (z == 1 && h > 0)
            {
                if (h > 1)
                {
                    dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 1));
                }
                if (w > 0)
                {
                    dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 0) + 1);
                }
     
            }
            if (z == 0 && w > 0)
            {
                if (w > 1)
                {
                     dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 0));
                }
                if (h > 0)
                {
                    dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 1) + 1);
                }
            }
        }
        else if(a[k]&0x01)
        {
            if (z == 1 && h > 0)
            {
                if (h > 1)
                {
                    dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 1));
                }
                if (w > 0)
                {
                    dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 0) + 1);
                }
     
            }
        }
        else
        {
            if (z == 0 && w > 0)
            {
                if (w > 1)
                {
                     dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 0));
                }
                if (h > 0)
                {
                    dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 1) + 1);
                }
            }
        }
        //cout << k <<" " <<h << " " << w << " " << z << " " << dp[k][h][w][z] << endl;
        return dp[k][h][w][z];
    }
     
    int main()
    {
        while(cin>>n)
        {
            for (int i = 0; i < n; ++i)
            {
                cin>>a[i];
            }
            if (n == 1)
            {
                cout << 0 << endl;
                continue;
            }
            if (n == 2)
            {
                cout << 1 << endl;
                continue;
            }
     
            memset(dp, -1, sizeof(dp));
     
            int h = n >> 1;
            if (n&0x01)
            {
                h ++;
            }
     
            cout << min(dfs(n-1, h, n-h, 1), dfs(n-1, h, n-h, 0)) << endl;
        }
        return 0;
    }
  • 相关阅读:
    JSP -java service pages
    java去重(1通过迭代器,2直接赋值)
    android 设置TextView水平滚动和解决首行缩进问题
    java 中字符串比较equals()和equalsIgnoreCase()的区别
    cursor的moveToNext()与moveToFirst()
    android studio快捷键
    android Android SDK Manager遇到的问题
    android onSaveInstanceState应用实例
    ProgressDialog的使用及逻辑处理
    POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】
  • 原文地址:https://www.cnblogs.com/liulangye/p/12161822.html
Copyright © 2011-2022 走看看