题目描述

菲菲和牛牛在一块 nnn 行 mmm 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。

棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。

落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。

棋盘的每个格子上,都写有两个非负整数,从上到下第 iii 行中从左到右第 jjj 列的格子上的两个整数记作 ai,ja_{i,j}ai,j​ 和 bi,jb_{i,j}bi,j​。

在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的 ai,ja_{i,j}ai,j​ 之和,牛牛的得分是所有有白棋的格子上的 bi,jb_{i,j}bi,j​ 的和。

菲菲和牛牛都希望,自己的得分减去对方的得分得到的结果最大。现在他们想知道,在给定的棋盘上,如果双方都采用最优策略且知道对方会采用最优策略,那么,最终的结果如何?

1≤n,m≤101 \leq n, m \leq 101≤n,m≤10,0≤ai,j,bi,j≤1050 \leq a_{i, j}, b_{i, j} \leq 10^50≤ai,j​,bi,j​≤105。

Solution

首先可以写一手对抗搜索,写得好加剪枝可能可以过掉。

回到正解。注意到任意时候场上填了的棋子必定都成一条从左下角往右上角走的路径。这条路径有 n+m−1n+m-1n+m−1 个转角,每个转角只会有两种方向:向右或向上。

考虑状压,设向上为 1,向右为 0。则下图可表示为:010010101。

思考每次放棋子会对状态进行怎样的更改。发现一个位置能放棋子,其在状态中必定对应着 01,而在这个位置放了棋子后,01 会变成 10。

比如说上图,若在第二行第三列放棋子,则状态变成:010100101。

转移的时候,处理出哪些位置可以放棋子,然后再根据当前的下棋人转移即可。

ps:用记忆化搜索就处理出当前状态的下棋人是谁,直接在搜索的时候记录一下就好。

Code

#include<cstdio>
#include<algorithm>
#define N 11
#define inf 2147483647
using namespace std;
int n,m,a[N][N],b[N][N],f[1<<(N<<1)];
bool bj[1<<(N<<1)];
int dfs(int s,int p)
{if (bj[s]) return f[s];f[s]=p?-inf:inf;int x=n+1,y=1; for (int i=0;i<n+m-1;++i){if (s&(1<<i)) --x;else ++y;if ((s&(3<<i))!=(1<<i)) continue;int ss=s^(3<<i);if (p) f[s]=max(f[s],dfs(ss,0)+a[x][y]);else f[s]=min(f[s],dfs(ss,1)-b[x][y]);}bj[s]=true;return f[s];
}
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]);bj[((1<<n)-1)<<m]=true;printf("%d\n",dfs((1<<n)-1,1));return 0;
}

【九省联考 2018】 一双木棋 chess相关推荐

  1. 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

    「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可 ...

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

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

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

    传送门 分析 我们用0表示向右,1表示向上 于是可以得到一条江棋盘分为两块的线 直接dp即可 代码 #include<iostream> #include<cstdio> #i ...

  4. [LUOGU] P4363 [九省联考2018]一双木棋chess

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

  5. luogu P4363 [九省联考2018]一双木棋chess

    analysis 这是一道很好的状压dp 这个题首先需要分析出任何一个合法的状态都可以化为从左下角到右上角的一条对角线 这样一来状态就很好表示了: 我们考虑设f[s]表示从状态s出发,最后先手减后手的 ...

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

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

  7. [九省联考2018]一双木棋chess——搜索+哈希

    题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/prob ...

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

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

  9. 洛谷P4363 [九省联考2018]一双木棋chess

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

  10. 洛谷 P4363 [九省联考2018]一双木棋chess 题解

    题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...

最新文章

  1. Java设计模式圣经连载(05)-代理模式
  2. 天津发票版本文件服务器端口,天津市增值税发票综合服务平台网址
  3. SocketIO---bio2---带线程池处理任务
  4. java面试题(转载其他人,方便日常看)
  5. python中函数定义_Python中函数的定义与使用
  6. centos7安装MySQL 5.7
  7. Linux中的内存段(BSS、数据段、代码段、堆、栈)
  8. 用javascript实现(页面正在加载的效果)
  9. linux下安装redis-cli
  10. (day 42 - 字符翻转 ) 剑指 Offer 58 - II. 左旋转字符串
  11. Mac OS X 通过命令行修改ip地址
  12. CMMB手机电视到了芯片企业创新的时侯
  13. 计算机专业英语学术论文框架,计算机专业英语研究学术论文.pdf
  14. System.setOut()重定向输出解释
  15. Python动态图见得多了?Excel:亦可赛艇!我可是身经百战了
  16. 华为设备配置小型园区网
  17. 数据库mysql的基本操作命令(全)
  18. 尚硅谷Linux运维讲解视频(2018.12)
  19. 免费的 ChatGPT镜像网站
  20. 微信小程序播放bilibili视频

热门文章

  1. 云计算存储基础(2)
  2. 跨界!京东云百分点联手构建AI+云生态蓝图
  3. 树莓派之搭建小型家用资料共享服务器
  4. 四川计算机专业最好的学校,四川2021年计算机学校有哪些专业比较好
  5. 81章 老子1章到_【图片】《道德经》读书笔记(希望从第1章到81章善始善终)【老子吧】_百度贴吧...
  6. AntdIcon 动态图标使用方式
  7. 使用win10自带IIS发布ASP.NET网站
  8. 复选框的全选和取消全选
  9. ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略
  10. 让iframe焕发新生