一双木棋(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. Delphi Canvas的FillRect(const Rect: TRect) 函数的作用

    http://blog.163.com/zhangzhifeng688@126/blog/static/165262758201131211341460/ Delphi Canvas的FillRect ...

  2. 【BASIS系列】SAP 设置系统timeout时间

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 设置系统timeout ...

  3. TensorFlow学习笔记2-性能分析工具

    TensorFlow学习笔记2-性能分析工具 性能分析工具 在spyder中运行以下代码: import tensorflow as tf from tensorflow.python.client ...

  4. 爬虫(五)—— 解析库(二)beautiful soup解析库

    目录 解析库--beautiful soup 一.BeautifulSoup简介 二.安装模块 三.Beautiful Soup的基本使用 四.Beautiful Soup查找元素 1.查找文本.属性 ...

  5. 《JAVA设计模式》之策略模式(Strategy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它 ...

  6. Codeforces 1082D (贪心)

    题面 传送门 分析 贪心 将度限制大于1的点连成一条链,然后将度限制等于1的点挂上去 形状如下图,其中(1,2,3)为度数限制>1的点 显然直径长度=(度数限制>1的节点个数)-1+min ...

  7. JS的video获取时长,出现问题汇总

    <video id="my_video_1" controls="controls" style=" width: 700px; height: ...

  8. ES6新增关键字let与var的区别

    最近看了很多文章,偶然间看到ES6中新增了一个关键字 let ,它具有与 var 关键字相似的功能.一开始使用它时,发现它让我对之前一些习以为常的东西产生了怀疑. 下面先让我们看看它和 var 之间用 ...

  9. FTP客户端遇到150连接超时错误的处理办法

    环境:阿里云ECS,win server 2012 R2 / FTP Server(FileZilla 0.9.41) 问题描述:账号连接正常,但无法列出目录,提示150连接超时. 解决过程: 1.关 ...

  10. DFSORT

    1.1   Outline   I.             Introduction Overview 2.1    What is DFSORT? 2.2    Usage of DFSORT 2 ...