考虑暴力。

每次枚举放哪个位置,设已经放了棋子的位置集合为 SSS,fS" role="presentation">fSfSf_S 表示当前放置情况为 SSS 时,双方采用最优策略后,两个人的权值和的差。

那么如果是菲菲,会选择 fS+ai,j" role="presentation">fS+ai,jfS+ai,jf_S+a_{i,j} 最大的,牛牛会选择 fS−bi,jfS−bi,jf_S-b_{i,j} 最小的,然后跑dfs

实际上如果记忆化一下就能过了。

考虑每一种合法的状态,棋子都是放置在左上角,那么放置的棋子的轮廓线就相当于是从左下角走到右上角的一条路径。那么总共只有 O(C(n+m+2,n+1))O(C(n+m+2,n+1))O(C(n+m+2,n+1)) 种情况。

大力map套vector搞过去

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#define gx(x) ((x)>>4)
#define gy(x) ((x)&15)
#define g(x,y) ((x)<<4|(y))using namespace std;const int N=20;map<vector<int>,int> M;int n,m,a[N][N],b[N][N],vis[N][N];
vector<int> lst;inline void fix(vector<int> &x){sort(x.begin(),x.end());x.erase(unique(x.begin(),x.end()),x.end());
}int dfs(vector<int> c,int p){fix(c);if(c==lst)return 0;if(M.count(c)) return M[c];int &ret=M[c];if(p) ret=-(1<<30); else ret=1<<30;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!vis[i][j] && (i==1 || vis[i-1][j]) && (j==1 || vis[i][j-1])){vector<int> nxt; vis[i][j]=1;for(int k=0;k<c.size();k++){int x=gx(c[k]),y=gy(c[k]);if(x==n || !vis[x+1][y] || y==m || !vis[x][y+1]) nxt.push_back(c[k]);}nxt.push_back(g(i,j));if(p) ret=max(ret,dfs(nxt,p^1)+a[i][j]);else ret=min(ret,dfs(nxt,p^1)-b[i][j]);vis[i][j]=0;}return ret;
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) scanf("%d",&b[i][j]);vector<int> cur;for(int i=1;i<=n;i++) lst.push_back(g(i,m));for(int i=1;i<=m;i++) lst.push_back(g(n,i));fix(lst);printf("%d\n",dfs(cur,1));return 0;
}

[博弈] LOJ#2471. 「九省联考 2018」一双木棋相关推荐

  1. 「九省联考 2018」一双木棋

    「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...

  2. @loj - 2478@「九省联考 2018」林克卡特树

    目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ 小 L 最近沉迷于塞 ...

  3. 【九省联考 2018】 一双木棋 chess

    题目描述 菲菲和牛牛在一块 nnn 行 mmm 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以 ...

  4. 九省联考2018 D1T1 一双木棋

    Alice和Bob轮流在n*m的棋盘上放棋子 a[i][j]表示Alice放在这的收益,b[i][j]表示Bob放在这的收益 一个地方没有棋子且它的左边上边都有棋子才能放棋子,边界外视为有一圈棋子 n ...

  5. 【九省联考2018】一双木棋

    题面 https://www.luogu.org/problem/P4363 题解 很套路的$hash$状态$+dp$. 可知棋子形成的形状一定是一个连续的倒楼梯形(楼梯向右延伸的长度可以不连续,但一 ...

  6. 【LOJ】#2479. 「九省联考 2018」制胡窜

    题解 老了,国赛之前敲一个后缀树上LCT和线段树都休闲的很 现在后缀树上线段树合并差点把我写死 主要思路就是后缀树+线段树合并+容斥,我相信熟练的OIer看到这已经会了 但就是不想写 但是由于我过于老 ...

  7. [loj 2478][luogu P4843]「九省联考 2018」林克卡特树

    传送门 Description 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一 ...

  8. LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分

    题意 给出一棵n个节点的树和k,边有边权,要求先从树中选k条边,然后把这k条边删掉,再加入k条边权为0的边,满足操作完后的图仍然是一棵树.问新树的带权直径最大是多少. n,k≤3∗105n,k≤3∗1 ...

  9. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

最新文章

  1. 如何通过抓包实战来学习Web协议?
  2. php 的adodb分页类
  3. Spring3 文件上传
  4. 阿里云云原生应用平台总经理丁宇:“连接、合作、赋能”,携手加速器伙伴助力企业云上创新
  5. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数
  6. 第一百五十期:Java程序员必备:异常的十个关键知识点
  7. POJ 1422 Air Raid
  8. 在 eclipse 中设置每行的字数
  9. 大数据架构师学习方向---加油。
  10. MDP马尔可夫决策过程(二)
  11. java定时任务_java:springBoot使用@Scheduled注解配置定时任务
  12. scala.Enumeration 枚举示例
  13. 测试测量(3)- 如何选择设备的平台
  14. 中国8位域名大玩家曝光(域名背后的真相)
  15. 如何搭建一个自己的私有云盘
  16. efishell无法开机shell_efi shell 添加启动项 修复启动
  17. 成长性思维和富人思维
  18. Qt依赖平台软件打开PDF
  19. Android 10 根文件系统和编译系统(十八):Android.bp语法
  20. android studio安装插件查看db数据库

热门文章

  1. 微机原理及故障的维修(BIOS)
  2. 硬核粉丝 | 清华双胞胎“YCY Dance Now”杀进超越杯编程大赛决赛
  3. php输出扶墙而立的三角形,第10章 天天扶墙而立
  4. 节点操作之创建和添加节点
  5. 第 6章 图——数据结构
  6. 8寸Single机台喷淋去胶加工服务
  7. android Menu菜单组键
  8. [Java] lomboz eclipse 下载. 后来安装启动报错,google了好久,未果。放弃之,转Myeclipse
  9. PHP中pear安装
  10. gradle-6.5-all 快速下载