zoukankan      html  css  js  c++  java
  • hdu4753 Fishhead’s Little Game 状态压缩,总和一定的博弈

    此题和UVA 10891 Game of Sum 总和一定的博弈,区间dp是一个道理,就是预处理麻烦

    这是南京网络赛的一题,一直没做,今天做了,虽然时间有点长,但是1ac,这几乎是南京现场赛的最后一道正式题了

    typedef long long LL;
    const int INF = 1000000007;
    const double eps = 1e-10;
    const int MAXN = 1000010;
    int into[20][20];
    int s[12];
    vector<int>p[25];
    bool vis[1 << 24];
    short dp[1 << 24];
    /**
    0 1 2
    3 4 5
    6 7 8
    9 10 11
    
    12 13 14 15
    16 17 18 19
    20 21 22 23
    */
    short dpf(int ss, int last)
    {
        if (!last) return 0;
        if (vis[ss]) return dp[ss];
        vis[ss] = true;
        short &ans = dp[ss];
        ans = 0;
        short tmp = 0;
        short tmplast = last;
        int nextss;
    
        REP(i, 24)
        {
            if ( (ss & (1 << i)) == 0)
            {
                nextss = ss | (1 << i);
                tmp = 0;
                tmplast = last;
                REP(j, p[i].size())
                {
                    if ( (nextss & s[p[i][j]]) == s[p[i][j]] )
                        tmp++, tmplast--;
                }
                tmp += tmplast - dpf(nextss, tmplast);
                ans = max(ans, tmp);
            }
        }
        return ans;
    }
    
    void init()
    {
        ///点到边的映射
        FE(i, 1, 16)
            if (i % 4) into[i][i + 1] = into[i + 1][i] = i - (i / 4) - 1;
        FE(i, 1, 12)
            into[i][i + 4] = into[i + 4][i] = 12 + i - 1;
    
        ///边到小正方形的映射,以及小正方形到边的映射
        CLR(s, 0);
        REP(i, 25) p[i].clear();
        REP(i, 9)
        {
            s[i] |= (1 << i);
            p[i].push_back(i);
            s[i] |= (1 << (i + 3));
            p[i + 3].push_back(i);
    
            s[i] |= (1 << (12 + (i / 3) * 4 + i % 3));
            p[12 + (i / 3) * 4 + i % 3].push_back(i);
            s[i] |= (1 << (13 + (i / 3) * 4 + i % 3));
            p[13 + (i / 3) * 4 + i % 3].push_back(i);
        }
    }
    int win[2];
    int n, m;
    int S;
    
    int main ()
    {
        int x, y, z;
        int T;
        int nc = 1;
        init();
        RI(T);
        while (T--)
        {
            CLR(win, 0);
            RI(m);
            S = 0;
            REP(i, m)
            {
                RII(x, y);
                z = into[x][y];
                S |= (1 << z);
                REP(j, p[z].size())
                {
                    if ((S & s[p[z][j]]) == s[p[z][j]])
                        win[i % 2]++;
                }
            }
            printf("Case #%d: ", nc++);
            int last = 9 - (win[0] + win[1]);
            if (!last)
            {
                puts(win[0] > 4 ? "Tom200" : "Jerry404");
            }
            else
            {
                CLR(vis, 0);
                win[m % 2] += dpf(S, last);
                if (m % 2 == 0) puts(win[m % 2] > 4 ? "Tom200" : "Jerry404");
                else puts(win[m % 2] > 4 ? "Jerry404" : "Tom200");
            }
        }
        return 0;
    }
    


  • 相关阅读:
    Spring Boot 的单元测试和集成测试
    Containers vs Serverless:你选择谁,何时选择?
    Java13新特性
    Java中创建对象的5种方法
    最好的重试是指数后退和抖动
    杂谈:面向微服务的体系结构评审中需要问的三个问题
    使用Quarkus在Openshift上构建微服务的快速指南
    Java EE—最轻量级的企业框架?
    AQS机制
    JVM-内存模型
  • 原文地址:https://www.cnblogs.com/pangblog/p/3402445.html
Copyright © 2011-2022 走看看