一双木棋(chess)

题目描述

菲菲和牛牛在一块 nn 行 mm 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。

棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。

棋盘的每个格子上,都写有两个非负整数,从上到下第 ii 行中从左到右第 jj 列的格子上的两个整数记作 A_{i,j}Ai,j​、B_{i,j}Bi,j​。在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的 A_{i,j}Ai,j​ 之和,牛牛的得分是所有有白棋的格子上的 B_{i,j}Bi,j​ 的和。

菲菲和牛牛都希望,自己的得分减去对方的得分得到的结果最大。现在他们想知道,在给定的棋盘上,如果双方都采用最优策略且知道对方会采用最优策略,那么,最终的结果如何。

输入格式

从标准输入中读入数据。

输入第一行包含两个正整数 n, mn,m,保证 n, m \leq 10n,m≤10。 接下来 nn 行,每行 mm 个非负整数,按从上到下从左到右的顺序描述每个格子上的第一个非负整数:其中第 ii 行中第 jj 个数表示 A_{i,j}Ai,j​。

接下来 nn 行,每行 mm 个非负整数,按从上到下从左到右的顺序描述每个格子上的第二个非负整数:其中第 ii 行中第 jj 个数表示 B_{i,j}Bi,j​。

输出格式

输出到标准输出中。

输出一个整数,表示菲菲的得分减去牛牛的得分的结果。

样例

样例输入

2 3
2 7 3
9 1 2
3 7 2
2 3 1

样例输出

2

样例解释

棋盘如图所示,双方都采用最优策略时,棋局如下:

  • 菲菲下在第 11 行第 11 列(这是第一步时唯一可以落子的格子);
  • 牛牛下在第 11 行第 22 列;
  • 菲菲下在第 22 行第 11 列;
  • 牛牛下在第 11 行第 33 列;
  • 菲菲下在第 22 行第 22 列;
  • 牛牛下在第 22 行第 33 列(这是这一步时唯一可以落子的格子);
  • 填满棋盘,游戏结束,盘面如下。

菲菲的得分为:2 + 9 + 1 = 122+9+1=12;牛牛的得分为:7 + 2 + 1 = 107+2+1=10。

数据范围与提示

对于所有的测试数据,n, m \leq 10, A_{i,j}, B_{i,j} \leq 100000n,m≤10,Ai,j​,Bi,j​≤100000。

对于编号为奇数的测试点,保证所有的 B_{i,j} = 0Bi,j​=0。

测试点 n=n= m=m=
1,2,31,2,3 22 22
4,5,64,5,6 33 33
7,87,8 55 55
9,109,10 88 88
11,1211,12 1010 11
13,1413,14 1010 22
15,1615,16 1010 33
17,18,19,2017,18,19,20 1010 1010

来源

CCF 2018省选Day1


Solution
一个合法的状态一定是一个左上角,也就是一条从左下走到右上的路线。
那么就是C(20,10)似乎不大。
考虑用hash压缩状态,记搜转移。
似乎跑的非常慢,还好oj快

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#define ll unsigned long long
#define p 793999
using namespace std;
int n,m,a[][],b[][],tmp[];
unordered_map<ll,int>f,g,s[];
ll get(){
ll H=;
for(int i=;i<=n;i++){
H=H*p+tmp[i];
}
for(int i=;i<=m;i++)s[i][H]=tmp[i];
return H;
}
void dfs(int x,ll k){
if(x==n*m+){f[k]=;return;}
if(g[k])return ;g[k]=;
for(int i=;i<=m;i++)tmp[i]=s[i][k];
int Mx=-1e9,Mi=1e9;
if(tmp[]<m){
tmp[]++;ll nx=get();dfs(x+,nx);
Mx=max(Mx,f[nx]+a[][tmp[]]);
Mi=min(Mi,f[nx]-b[][tmp[]]);
tmp[]--;
}
for(int i=;i<=n;i++){
if(tmp[i]<tmp[i-]){
tmp[i]++;ll nx=get();dfs(x+,nx);
Mx=max(Mx,f[nx]+a[i][tmp[i]]);
Mi=min(Mi,f[nx]-b[i][tmp[i]]);
tmp[i]--;
}
}
if(x&)f[k]=Mx;else f[k]=Mi;
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)scanf("%d",&a[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)scanf("%d",&b[i][j]);
dfs(,);
cout<<f[]<<endl;
return ;
}
 

一双木棋(chess)的更多相关文章

  1. 洛谷P4363 一双木棋 chess

    洛谷P4363 一双木棋 chess 省选最水的一道题了. 且看我数个月AC一道题...... 具体是这样的:我们发现这个下了棋的地方一定形成一个锯齿形,那么怎么状态压缩呢? 维护轮廓线! 从左下角出 ...

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

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

  3. 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】

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

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

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

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

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

  6. BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)

    BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...

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

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

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

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

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

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

  10. 洛谷P4363 一双木棋chess [九省联考2018] 搜索+hash

    正解:记搜+hash 解题报告: 传送门! 因为看到nm范围特别小,,,所以直接考虑爆搜(bushi 先考虑爆搜之后再想优化什么的嘛QwQ 首先对这种都要最优的,就可以直接把答案设为针对某一方,然后题 ...

随机推荐

  1. 设计模式 - 装饰器模式(Decorator)

    简介 场景 通过继承和关联都可以给对象增加行为,区别如下: 继承是静态的(无法在程序运行时动态扩展),且作用于所有子类.硬编码,高耦合. 通过装饰器可以在运行时添加行为和属性到指定对象.关联关系就是在 ...

  2. MongoDB分片配置 优化 不错

    简单注解:mongos 路由进程, 应用程序接入mongos再查询到具体分片,监听端口默认27017config server 路由表服务, 每一台都具有全部chunk的路由信息 shard为数据存储 ...

  3. socket选项总结(setsockopt)

    功能描述:        获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...

  4. jQuery防止中文乱码

    window.location.href = "?supplier=" + escape($("#ddlUser").val()) + "&t ...

  5. php有几种开发语言

    php有几种开发语言? php的启发语言有五种,分别是C.Perl.Java.C++.Python. PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”) ...

  6. Ubuntu TTy字体

    目的:修改tty终端下的字体大小,中文显示,字体美观问题 Linux版本:xubuntu14.04 当切换到tty终端模式式,中文乱码,且字体太小,影响阅读.在网上搜了一些资料,将问题及解决方案记录如 ...

  7. Spring Security 03

    认证和鉴权 配置文件方式 <authentication-manager> <authentication-provider> <!-- 用户的权限控制 --> & ...

  8. [Linux] 001 预备知识

    Unix 1965年 MIT,通用电气(GE),AT&T 的贝尔实验室联合开发 项目名称:Multics 目标:开发一种交互式的,具有多道程序处理能力的分时操作系统 后来:贝尔实验室宣布退出 ...

  9. bootstrap-select、datatables插件使用

    1.引入样式文件 <%--引入bootstrap_select样式--%> <link rel="stylesheet" type="text/css& ...

  10. web开发jsp页面遇到的一系列问题

    一:web总结 1.jsp页面知识点巩固 1.1字符串数字格式化转换 <%@ taglib prefix="fmt" uri="http://java.sun.co ...