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


  • 相关阅读:
    awk统计命令(求和、求平均、求最大值、求最小值)(转)
    高性能跨平台网络IO(Reactor、epoll、iocp)总结
    进程通信和同步(转)
    C++11原子操作与无锁编程(转)
    在线代码编译运行工具
    linux ps 命令的查看
    转: linux sed 命令的使用
    转:利用Eclipse CDT 阅读C/C++代码
    转:Raft一致性选举算法的ppt与视频
    转:ffmpeg time_base详解
  • 原文地址:https://www.cnblogs.com/pangblog/p/3402445.html
Copyright © 2020-2023  润新知