洛谷题目传送门

解题思路

nnn和mmm都很小,很容易想到状压DP
题目描述的规则大致是长这个样子

也就是说填的位置单调递减,我们大胆一点,设一个10进制的状压,表示每一列填到了那个位置,那么这个数要单调递减,易证明这样的合法状态数是很小的
既然是一道博弈DP题,那么我们需要倒叙DP,因为如果正序,我们会不知道未来的情况如何,而倒着的话就可以知道了,对于A选手,他想让ValA−ValBValA-ValBValA−ValB最大,但是他应该从最小的一个状态转移,这里应用到Min−MaxMin-MaxMin−Max搜索的思想,题目说每个人知道另外一个人会使用最优状态,所以第二个人一定会阻止A从最大的转移,那么如果A想从较大的转移,B一定也会阻止他,所以A只能从最不优的转移,这样B才不会阻止他

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL INF = 1e15;
const int N =12;
const int S = 2e6+7;
int num[S];
LL s[S];
LL f[S];
int tot=0;
int n,m;
int a[N][N],b[N][N];
void put(LL x)
{for(int i=1;i<=m;i++){cout<<x%11<<' ';x/=11;}cout<<endl;
}
map<LL,int> mp;
void Make(int x,int y,LL val,int p)
{if(x==m+1){num[++tot]=p;mp[val]=tot;s[tot]=val;return;}for(int i=0;i<=y;i++)Make(x+1,i,val*11ll+i,p+i);
}
void dp()
{f[tot]=0;for(int i=tot-1;i>=1;i--){if(num[i]&1){f[i]=INF;LL add=1;LL st=s[i];for(int j=m;j>=1;j--,add*=11,st/=11){LL v=st%11;if(v==n) continue;LL t=mp[s[i]+add];     if(!t) continue;f[i]=min(f[i],f[t]-b[v+1][j]);}}else{f[i]=-INF;LL add=1;LL st=s[i];for(int j=m;j>=1;j--,add*=11,st/=11){LL v=st%11;if(v==n) continue;LL t=mp[s[i]+add];if(!t) continue;f[i]=max(f[i],f[t]+a[v+1][j]);}}}
}
int main()
{cin>>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]);Make(1,n,0,0);dp();cout<<f[1];return 0;
}

[九省联考2018]一双木棋chess(状压DP+博弈论+Minmax搜索)相关推荐

  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. 遮挡也能识别?地平线提出时序信息提升行人检测准确度|​CVPR 2020
  2. 第十三届计算机语言学大会,第十三届全国语音学学术会议(PCC 2018) 会议通知第3号...
  3. 2. Oracle 数据库实例启动关闭过程
  4. 怎么转换html格式文件怎么打开,html格式怎么转换
  5. tf.clip_by_global_norm理解
  6. SUN JAVA面试笔试题2
  7. Hive _函数(系统内置函数、自定义函数、自定义UDF函数)
  8. Linux笔记-利用chkconfig创建脚本使得Rabbimq开机自启
  9. 倒序数(信息学奥赛一本通-T1160)
  10. 【FPGA】——UART串口通信
  11. 多进程通信相关函数归纳
  12. 2021年,开发者们如何拥抱 5G 消息?
  13. hiberanate 主键查询慢_hibernate 新加数据 查询 缓存 变慢
  14. 《XHTML》pdf
  15. 从shell(终端)中退出python
  16. 双物块弹簧阻尼系统模型,李雅普诺夫稳定性分析,matlab仿真验证
  17. Linux环境入侵应急与排查
  18. 深度系统官网linux安装打印机,在Deepin 20下安装brother打印机驱动及设置网络打印机...
  19. python剔除数字 青少年编程电子学会python编程等级考试二级真题解析2020年12月
  20. Go实战--也许最快的Go语言Web框架kataras/iris初识四(i18n、filelogger、recaptcha)

热门文章

  1. electron 连接打印机打印pdf文件
  2. 安卓APP上传市场开通开发者权限\上传操作
  3. C#:读取xls文件
  4. ubuntu如何修改文件夹的权限
  5. OSChina 周五乱弹 —— 如果有一天不当程序员了
  6. 机器学习 ML在材料领域应用
  7. libreoffice转换文件乱码
  8. C/C++ 的rationale
  9. vue+django下载压缩包解压失败处理办法
  10. PDF文件压缩的4个方法,个个高效好用,别错过