发现数据范围很小,想到状压dp,然后就愣住不会了。

表示太菜了并没有接触过轮廓线dp这种操作。

首先发现合法的操作过程中一定是这样子的:

按照行来看发现每一行单调不递增。

我们用$1$来表示竖着的轮廓线,用$0$来表示横着的轮廓线,那么来看一下样例,一个棋子都没有放的状态是$00011$,而在唯一的$(1, 1)$位置放上第一个棋子之后状态就变成了$00101$。

其实是这么画出来的:

    

这样子就发现其实一个$1$后面有多少个$0$就代表放到了第几个,因为每一行是单调不递减的我们就可以从这个状态的表示中算出当前放到了哪里。

玩一下放旗子的过程发现,其实转移的过程就相当于找到一个左边是$0$的$1$,然后把两个数交换一下。

因为轮廓线的大小是肯定的,所以有效状态的个数就相当于从$(1, m)走到$(n, 1)$,并$在$n + m$步中选择$n$步向下走的方案数,为$\binom{n + m}{n}$个。

然而转移顺序似乎并不显然,记忆化搜索?

其实这个搜索还有一个高端的名字叫做对抗搜索,先手希望价值最大,后手希望价值最小,应该比较显然。

时间复杂度是$O(\binom{n + m}{n})$。

搜的时候注意先记$vis$再转移。

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = ;
const int S = ( << ()) + ;
const ll P = 1e9 + ;
const ll inf = (ll) << ; int n, m;
ll a[N][N], b[N][N], f[S];
bool vis[S]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(ll &x, ll y) {
if(y > x) x = y;
} inline void chkMin(ll &x, ll y) {
if(y < x) x = y;
} ll dfs(int s, int who) {
if(vis[s]) return f[s];
vis[s] = ;
ll res = who ? -inf : inf;
for(int i = , x = n + , y = ; i < n + m; i++) {
if((s >> i) & ) x--;
else y++;
if(((s >> i) & ) != || i == n + m - ) continue;
int to = s ^ ( << i);
if(who) chkMax(res, dfs(to, who ^ ) + a[x][y]);
else chkMin(res, dfs(to, who ^ ) - b[x][y]);
}
return f[s] = res;
} int main() {
read(n), read(m);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
read(a[i][j]);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
read(b[i][j]); f[(( << n) - ) << m] = , vis[(( << n) - ) << m] = ;
printf("%lld\n", dfs(( << n) - , ));
return ;
}

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

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

    传送门 对抗搜索都不会,我真是菜死了qwq 首先根据题目条件,可以发现从上到下每一行的棋子数是单调不增的,然后n m都比较小,如果把状态搜出来,可以发现合法状态并不多,所以可以用一个11进制数表示状态 ...

  2. 【题解】Luogu P4363 [九省联考2018]一双木棋chess

    原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...

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

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

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

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

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

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

  6. Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】

    题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #includ ...

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

    题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博 ...

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

    思路 容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示 转移就是10变成01 代码 #include <cstdio> #include <algo ...

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

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

随机推荐

  1. uuid 学习

    #include <vector> #include <iostream> #include <boost/uuid/uuid.hpp> #include < ...

  2. 分析 PHP升级导致系统负载过高问题(转载)

    原文:http://chuansongme.com/n/797172 背景 据XX部门兄弟反应, 其在将PHP从5.3.8 升级到5.5.13 时, 开始运行正常, 运行一段时间后, 系统负载变高,达 ...

  3. POJ - 1324 Holedox Moving (状态压缩+BFS/A*)

    题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...

  4. Scala 面向接口编程

    1.如果要实现一个接口,前边没有extends关键字就可以使用extends,如果有要使用with关键字 2.Scala 中的接口支持多种继承,类或者抽象类不支持多种继承 3.抽象属性:未被实例化的属 ...

  5. 图片的base64编码通过javascript生成图片--当前URL地址的二维码应用

    前面的话 在电脑端发现一篇好的博文,想在手机上访问.这时,就必须打开手机浏览器输入长长的URL地址才行,非常不方便.如果在博客标题的后面跟一张小的图片,点击该图片后,出现一张二维码的大图,然后再通过手 ...

  6. 查看.Net Framework版本号

    目录 摘要 .NET Framework 的版本 确定计算机上安装的 .NET Framework 版本 补充几个查看.Net Framework版本号 概要 本文描述如何确定计算机上安装的 Micr ...

  7. Redis Sentinel(哨兵)主从高可用方案

    环境搭建 三台服务器: 192.168.126.100(master) 192.168.126.110(slaver) 192.168.126.120(slaver) 拷贝192.168.126.10 ...

  8. WPF中ItemsControl绑定到Google ProtocolBuffer的结构体时的性能问题

    背景: 最近遇到一个DataGrid的性能问题:里面大概有4000个数据, 绑定的ItemSource的类也只有一层数据,即简单的List(里面每个是Protocol Buffer自动产生的一个类,1 ...

  9. mongo之map-reduce笔记

    package com.sy.demo; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import ...

  10. Spring Boot自定义配置与加载

    Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...