题目描述

https://www.lydsy.com/JudgeOnline/problem.php?id=5248

 

Solution

我们首先考虑放棋子的操作

发现它一定放棋子的部分是一个联通块,不放棋子的是一个联通块

所以 我们考虑怎么表示这个轮廓

分析一下 N,M<=10 ?!

状态压缩?大爆搜?

然后我选择了状压…[听说大爆搜+hash也能做x]

用一串01串表示这个轮廓 表示从右上开始的一条路径,0表示向左走一步,1表示向下走一步,这样就可以通过一串0和1表示一个轮廓

每次的操作就是把一个01[左1下1]变成一个10[下1左1]

然后就是解决博弈的问题,理性分析[感性理解]一下 用dp[st]表示轮廓线状态为st的时候 最小化得分的差值

然后再感性理解一下

因为后手在第二步时 有办法选择对自己最优的情况进行转移,所以后手的转移就从他所能到达的状态选择一个最优的状态转移过来,如果当前是先手,就从当前可以到达的状态最劣的状态转移过来[感性理解x]

因为直接转移的话层次不是很显然,这里采取记忆化搜索实现这个dp[代码细节还是挺多的x]

Code

  1. #include <bits/stdc++.h>  
  2. using namespace std;  
  3. int N,M;  
  4. bool used[5050006];  
  5. int dp[5050006],qwq;  
  6. int A[25][25],B[25][25];  
  7. int dfs(int st)  
  8. {  
  9.     if (used[st])  
  10.       return dp[st];      
  11.       int x=1,y=N+1,Con=0;  
  12.     int &ans=dp[st];  
  13.     used[st]=1;  
  14.     for (int i=0;i<qwq;i++)  
  15.       if (st&(1<<i)) Con+=y-1;  
  16.       else y--;  
  17.     y=N+1;  
  18.     ans=-1e9;  
  19.     if (st&1) x++;  
  20.     else y--;  
  21.     for (int i=1;i<qwq;i++)  
  22.     {  
  23.       if ((st&(1<<i))&&!(st&(1<<(i-1))))  
  24.          {  
  25.             if (Con%2==0)  
  26.                ans=max(-dfs(st^(1<<i)^(1<<(i-1)))+A[y][x],ans);  
  27.             else ans=max(-dfs(st^(1<<i)^(1<<(i-1)))+B[y][x],ans);  
  28.          }  
  29.       if (st&(1<<i))  
  30.         x++;  
  31.        else y--;  
  32.     }  
  33.     return ans;  
  34. }  
  35. int main()  
  36. {  
  37.     scanf("%d%d",&N,&M);  
  38.     qwq=N+M;      
  39.     used[(1<<M)-1]=1;  
  40.     for (int i=1;i<=N;i++)  
  41.       for (int j=1;j<=M;j++)  
  42.         scanf("%d",&A[i][j]);  
  43.     for (int i=1;i<=N;i++)  
  44.       for (int j=1;j<=M;j++)  
  45.         scanf("%d",&B[i][j]);  
  46.     cout<<dfs(((1<<(N+M))-1)^((1<<N)-1));  
  47.     return 0;  
  48. }  

[BZOJ5248][2018九省联考]一双木棋的更多相关文章

  1. bzoj5248(洛谷4363)(2018九省联考)一双木棋

    题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...

  2. [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP

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

  3. BZOJ5248:[九省联考2018]一双木棋——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...

  4. 2018九省联考(SHOI2018)

    听说在退役前还能有去外省的机会QAQ D1 9点T1,T2过拍,感觉自己稳得一批,然后边看T3边幻想AK 事实证明我是多么菜多么无知多么傻逼 想T3时太浮躁,最后也没想出来 T2根本没有想过去怀疑自己 ...

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

    [BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何 ...

  6. [BZOJ5248][九省联考2018]一双木棋(连通性DP,对抗搜索)

    5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 34[Submit][Status ...

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

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

  8. [九省联考2018]秘密袭击coat

    [九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...

  9. 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)

    [BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...

随机推荐

  1. ubuntu 卡在登陆界面无法进入桌面,但是可以进入命令行界面

    ubuntu 卡在登陆界面无法进入桌面,但是可以进入命令行界面(初步断定是Xwindows界面软件出问题了,所以重装即可!)Solve: 1.Ctrl+Alt+F1进入命令行界面,root账户登陆2. ...

  2. [Jmeter]如何才能通过ant运行jmeter

    在开始运行build.xml之前,还有一步必须要做,那就是将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制到Ant所在目录lib子目录之下,这样Ant运行时才 ...

  3. IndexedDB:浏览器里内置的数据库(转)

    出处;http://www.webhek.com/indexeddb/ IndexedDB是HTML5规范里新出现的浏览器里内置的数据库.对于在浏览器里存储数据,你可以使用cookies或local ...

  4. spring aop记录用户的操作

    1.命名空间 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.or ...

  5. 转 group_concat函数详解

    MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...

  6. event.preventDefault() vs. return false

    使用jquery方式的话,以下是等效的 return false === event.stopPropagation + event.preventDefault() //1. event.preve ...

  7. 整理悬浮在列表中a元素时改变a元素上下边框颜色的问题。

    整理一下当悬浮在a元素上时a的上下边颜色改变,并且里面的内容不会移动,下面是PSD图效果区域: 刚开始我先给A元素加了上下边框和颜色,利用a:hover改变a元素上下的边框颜色,但是第一个a元素的下边 ...

  8. canvas基础API

    1.路径绘图: 把“钢笔”移动到画布的某个位置上 ctx.moveTo(x,y) 把“钢笔”连线到画布的某个位置上 ctx.lineTo(x,y) 描边路径的api ctx.stroke() 填充路径 ...

  9. Hdu1560 DNA sequence(IDA*) 2017-01-20 18:53 50人阅读 评论(0) 收藏

    DNA sequence Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  10. EventBus事件总线框架(发布者/订阅者模式,观察者模式)

    一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. In ...