#轮廓线dp,博弈论#洛谷 4363 [九省联考 2018] 一双木棋 chess
分析
菲菲想让答案尽量大,牛牛想让答案尽量小。
很天真的一种想法就是设 \(dp[i][j]\) 表示现在选择 \((i,j)\) 的答案。
但是这样有一个弊端就是并不知道其它位置怎么选择。
准确来说,已经被选择的位置和未被选择的位置存在一条分割线,或者直接叫轮廓线。
设横着的轮廓表示0,竖着的轮廓表示1,那么一开始的轮廓线从左下往右上看就是 \(n\) 个 \(1\) 和 \(m\) 个 \(0\)。
然后每次选择的位置就是形如 \(\dots10\dots\) 的 \(0\) 所在的位置,每次选择一个合适的位置将这个数算进贡献中。
可以发现每种轮廓线只能被其中一个人选择,转移大概就是如果是菲菲操作,那么加 \(a_{x,y}\) 取最大值,否则牛牛减 \(b_{x,y}\) 取最小值。
那么这样可用的状态实则为 \(\binom{n+m}{n}\) 个,记忆化一下就可以了。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int _inf=0xcfcfcfcf;
int dp[1<<20],n,m,a[11][11],b[11][11];
void Min(int &x,int y){x=x<y?x:y;}
void Max(int &x,int y){x=x>y?x:y;}
int dfs(int S,int opt){
if (dp[S]!=_inf) return dp[S];
if (opt) dp[S]=-dp[S];
int x=1,y=m;
for (int i=0;i<(n+m-1);++i){
if (((S>>i)&3)==2){
int _S=S^(3<<i);
if (!opt) Max(dp[S],dfs(_S,1)+a[x][y]);
else Min(dp[S],dfs(_S,0)-b[x][y]);
}
if ((S>>i)&1) ++x;
else --y;
}
return dp[S];
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j) cin>>a[i][j];
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j) cin>>b[i][j];
memset(dp,0xcf,sizeof(dp));
dp[(1<<n)-1]=0;
cout<<dfs(((1<<n)-1)<<m,0);
return 0;
}
#轮廓线dp,博弈论#洛谷 4363 [九省联考 2018] 一双木棋 chess的更多相关文章
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 题解
题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...
- Luogu 4363 [九省联考2018]一双木棋chess
发现数据范围很小,想到状压dp,然后就愣住不会了. 表示太菜了并没有接触过轮廓线dp这种操作. 首先发现合法的操作过程中一定是这样子的: 按照行来看发现每一行单调不递增. 我们用$1$来表示竖着的轮廓 ...
- BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)
BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...
- 【题解】Luogu P4363 [九省联考2018]一双木棋chess
原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...
- [九省联考2018]一双木棋chess——搜索+哈希
题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/prob ...
- Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】
题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #includ ...
- [九省联考2018]一双木棋chess
题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博 ...
- P4363 [九省联考2018]一双木棋chess
思路 容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示 转移就是10变成01 代码 #include <cstdio> #include <algo ...
随机推荐
- 在python中发送自定义消息
.py import win32api, win32con, win32gui import win32gui_struct import ctypes from ctypes import * GU ...
- 常用Windows控制台命令
查看网络连接信息 1.查看所有网络连接 netstat -ano -a 显示所有连接和侦听端口. -n 以数字形式显示地址和端口号. -o 显示拥有的与每个连接关联的进程 ID. 详细的使用方式使用n ...
- Python全栈面试题及知识点总结
Python全栈面试题 Python全栈阶段总结:https://github.com/HkwJsxl/PythonFullStack/tree/master/Notes Python基础 基础 逻辑 ...
- JAVA 考试管理系统 大作业(一):需求分析
好家伙,有需要的拿去借鉴吧(虽然我也百度了很多) 题目如下: 题目四:考试管理系统 (选做要求:使用图形用户界面) 分3种用户角色:教务员(具有管理权限).教师.学生 l 教务员:可以进行用户管理( ...
- 【Azure 应用服务】App Services 恶意软件防护相关
问题描述 App Services 恶意软件防护相关资料,App Service是否默认开启病毒防护呢? 问题解答 App Services 默认启用了Antimalware 软件功能,Microso ...
- 【Azure Redis 缓存】Redis Geo-replication(异地复制)的问题
问题描述 在Azure官网中,已列出了一系列的常规问题:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-geo-repli ...
- Go语言的100个错误使用场景(55-60)|并发基础
目录 前言 8. 并发基础 8.1 混淆并发与并行的概念(#55) 8.2 认为并发总是更快(#56) 8.3 分不清何时使用互斥锁或 channel(#57) 8.4 不理解竞态问题(#58) 8. ...
- Kafka的Controller
控制器组件(Controller),是 Apache Kafka 的核心组件.它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群.集群中任意一台 Broker ...
- tomcat 安装笔记 20230901
war位置 /usr/local/tomcat8_1/webapps/ tomcat位置 71.170 /usr/local/tomcat8_1/ 给了点工具包 位置 /usr/local/tool/ ...
- 英语自定义标签 <i:juzi><i:zhuyu>John Smith</i:zhuyu></i:juzi> 主语谓语宾语
效果 John Smith died in World War Two. John Smith killed three enemy soldiers. <style> i\:juzi { ...