九省联考2018D1T1 一双木棋

65人阅读 评论(0) 收藏 举报
分类:

链接

可以观察到,整个对局过程中的任意时刻,棋盘总是被一条从左下到右上的轮廓线拆分成有子和无子的两部分。因此,我们可以考虑轮廓线dp,从左下角开始,向上的边为1,向右的边为0。设f[sta]表示当状态为sta时,双方都选择最优方案还能获得的收益,则初始状态(也就是最终对局结果)为f[11...1100...00],最终状态(也就是开始对局的状态)为f[00...0011...11]。状态倒着读,因为低位在右边。

然后考虑转移。当一颗棋子落下时,棋盘落子处的轮廓线将会从“上——右”变为“右——上”,对应的状态某处也会从f[...01...]变为f[...10...]单纯的dp转移不好想,那么就选择记忆化搜索。

时间复杂度C(n+m, n),空间复杂度2^n。

#include <iostream>
#include <cstring>

const int inf = 0x3f3f3f3f;

using namespace std;

int n, m;
int a[13][13];
int b[13][13];
int f[1 << 20];

int dfs(int sta, bool now) //sta为状态,now为当前轮到谁走
{
    if (f[sta] != inf) return f[sta];
    f[sta] = now ? -inf : inf;
    int x = n, y = 0;
    for (int i = 0; i < n + m - 1; i++) { //遍历轮廓线
        if (sta >> i & 1) x--;
        else y++;
        if ((sta >> i & 3) != 1) continue;
        int nxt = sta ^ (3 << i); //把01变10
        if (now) f[sta] = max(f[sta], dfs(nxt, now ^ 1) + a[x][y]); //a希望a-b更大
        else f[sta] = min(f[sta], dfs(nxt, now ^ 1) - b[x][y]); //b希望b-a更大,相当于a-b更小
    }
    return f[sta];
}

int main(void)
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> a[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> b[i][j];
    memset(f, 0x3f, sizeof f);
    f[(1 << n) - 1 << m] = 0;
    cout << dfs((1 << n) - 1, 1);
    
    return 0;
}


查看评论

终极版C语言(九)

整个教程以 C++ 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习。讲课生动风趣、深入浅出,全套视频内容充实。
  • 2017年03月20日 14:10

九省联考2018D1T3 秘密袭击

链接又是一道经典的暴力碾标算。对每个点分别贡献最后加一块就好了。假如当前正在计算s的贡献,设f[i][j]代表包含从s到i的路径且使得s为第j大的连通块个数,进行简单的树上dp,s最终带来的贡献就是f...
  • star_city_7
  • star_city_7
  • 2018-04-15 20:34:07
  • 72

九省联考2018D1T2 IIIDX

链接很容易发现,歌曲间的关系构成了一棵树,于是O(n)的贪心算法也就是显然的。但是我们对贪心带来的55~60分不满意,鉴于这个题是个nlogn范围,所以还是用数据结构吧。很容易发现,题目给出的n首歌的...
  • star_city_7
  • star_city_7
  • 2018-04-15 16:05:56
  • 29

#2472. 「九省联考 2018」IIIDX

一眼思路的题… 就是比较难写.. 考虑一个点必须小于其 ⌊idk⌋⌊idk⌋ \lfloor \frac{id}{k} \rfloor 那么容易想出一个树形结构,每个点都大于其父亲. 那么对于一...
  • Tgotp
  • Tgotp
  • 2018-04-15 15:15:16
  • 56

[九省联考2018]秘密袭击coat——树形DP

虽然这只是个暴力,正解并不会写。。。但是这个暴力也让我长见识了。。。 题目大意: 给定一棵树,每个节点有一个权值,求所有的联通块中权值为第k大的权值和。 思路: 遇到不会做的题目一定要...
  • ylsoi
  • ylsoi
  • 2018-04-13 18:50:43
  • 69

[九省联考 2018] 一双木棋chess

题目描述: 有一个 n∗m的方格, Alice 和 Bob 玩游戏。每次每人可以选择一个格子占领,前提是这个格子未被占领且它左上方的所有格子都已被占领。 第 i行第 j 列的格子若被 Alice ...
  • qq_35914587
  • qq_35914587
  • 2018-04-09 09:18:07
  • 77

九省联考 一双木棋

一双木棋 状压+min-max对抗搜索 说出来丢人,笔者作为高一试水狗这题就滚粗了 我果然什么也不会 本题思路很明确,直接记忆化min-max对抗搜索即可 为啥我没想到 所谓min-max...
  • assass_cannotin
  • assass_cannotin
  • 2018-04-08 10:52:53
  • 86

【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

题面BZOJDescription菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个...
  • qq_30974369
  • qq_30974369
  • 2018-04-06 22:31:08
  • 183

【BZOJ5248】【2018多省省队联测】一双木棋

【题目链接】点击打开链接【思路要点】显然,任意时刻游戏棋盘的轮廓线是单调的。因此,我们可以用一个\(O(N+M)\)位的二进制数描述一个轮廓线。记忆化搜索即可,时间复杂度\(O(M*\binom{N+...
  • qq_39972971
  • qq_39972971
  • 2018-04-09 12:40:25
  • 72

bzoj5248 [2018多省省队联测]一双木棋

5248: [2018多省省队联测]一双木棋Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 155  Solved: 132[Submit][Statu...
  • C_K_Y_
  • C_K_Y_
  • 2018-04-09 22:36:49
  • 34
    个人资料
    等级:
    访问量: 0
    积分: 40
    排名: 0
    文章存档