[BZOJ5248][2018九省联考]一双木棋
题目描述
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
- #include <bits/stdc++.h>
- using namespace std;
- int N,M;
- bool used[5050006];
- int dp[5050006],qwq;
- int A[25][25],B[25][25];
- int dfs(int st)
- {
- if (used[st])
- return dp[st];
- int x=1,y=N+1,Con=0;
- int &ans=dp[st];
- used[st]=1;
- for (int i=0;i<qwq;i++)
- if (st&(1<<i)) Con+=y-1;
- else y--;
- y=N+1;
- ans=-1e9;
- if (st&1) x++;
- else y--;
- for (int i=1;i<qwq;i++)
- {
- if ((st&(1<<i))&&!(st&(1<<(i-1))))
- {
- if (Con%2==0)
- ans=max(-dfs(st^(1<<i)^(1<<(i-1)))+A[y][x],ans);
- else ans=max(-dfs(st^(1<<i)^(1<<(i-1)))+B[y][x],ans);
- }
- if (st&(1<<i))
- x++;
- else y--;
- }
- return ans;
- }
- int main()
- {
- scanf("%d%d",&N,&M);
- qwq=N+M;
- used[(1<<M)-1]=1;
- 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]);
- cout<<dfs(((1<<(N+M))-1)^((1<<N)-1));
- return 0;
- }
[BZOJ5248][2018九省联考]一双木棋的更多相关文章
- bzoj5248(洛谷4363)(2018九省联考)一双木棋
题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...
- [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP
题面 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子 ...
- BZOJ5248:[九省联考2018]一双木棋——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...
- 2018九省联考(SHOI2018)
听说在退役前还能有去外省的机会QAQ D1 9点T1,T2过拍,感觉自己稳得一批,然后边看T3边幻想AK 事实证明我是多么菜多么无知多么傻逼 想T3时太浮躁,最后也没想出来 T2根本没有想过去怀疑自己 ...
- 【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)
[BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何 ...
- [BZOJ5248][九省联考2018]一双木棋(连通性DP,对抗搜索)
5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 43 Solved: 34[Submit][Status ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...
- [九省联考2018]秘密袭击coat
[九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...
- 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)
[BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...
随机推荐
- 逆序对 分治nlogn
定义:A是包含n个元素的有序序列{a1,a2 … an},若ai > aj 且 i < j ,则称 (ai , aj)是A的一个逆序对.求逆序对是指求出A中存在逆序对的数量. 这个算法是归 ...
- ps 中添加一张图片
// 测试打开一个文件var fileref = new File ("/E/work/没有图片提交/2014/2014.5.19/G20/部件渲染测试/png/tianji_1-41001 ...
- Interceptor for {http://cxf.liuyang.com/}IHiServiceService has thrown exception, unwinding now org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
Jquery同域访问:客户端连接服务器访问跨域访问:通过本地html文档,浏览器点击开访问(jquery不支持此访问) 用域名的方式访问http://localhost:8080/CXF_09_jqu ...
- Easy mistakes in c#
ACCESS MODIFIERS c# has some access modifiers as below: public:class or member can be accessed by no ...
- Jenkins 使用 Build Flow 插件配置工作流任务依赖
Jenkins 使用 Build Flow 插件配置工作流任务依赖 Jenkins 多任务依赖方式的配置方法目前可以通过MultiJob Project 或者Build Flow 或者Piplelin ...
- WebLogic 两处任意文件上传漏洞动态分析(CVE-2018-2894)
0x01 前言 CNCERT前几天发公告称发现Oracle公司出品的基于JavaEE结构的中间件WebLogic产品存在一个远程上传漏洞,并得到了厂商的确认,危害程度评分高达9.8分.鉴于厂商已进行了 ...
- [JAVA]java复制文件的4种方式
尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...
- cesium编程中级开篇
cesium编程中级开篇 其实初级,中级并无定论,我理解的初级是根据官方教程,先学会如何部署环境,搭建hello world,使用官方提供的工具,完成一些示例, 而中级就是在这些的基础上,自己定制一些 ...
- 云捕Redis实战
本文由作者余宝虹授权网易云社区发布. Redis是一个支持丰富数据结构的分布式key-value系统,Redis在云捕系统的地位相当重要,碰到的问题也比较多,最近才解决了一个遗留的老大难问题.由于15 ...
- Docker 搭建 etcd 集群配置
#关闭selinux.防火墙 systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --s ...