一双木棋(chess)
一双木棋(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
#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)的更多相关文章
- 洛谷P4363 一双木棋 chess
洛谷P4363 一双木棋 chess 省选最水的一道题了. 且看我数个月AC一道题...... 具体是这样的:我们发现这个下了棋的地方一定形成一个锯齿形,那么怎么状态压缩呢? 维护轮廓线! 从左下角出 ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...
- 【题解】Luogu P4363 [九省联考2018]一双木棋chess
原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...
- [九省联考2018] 一双木棋 chess
Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可 ...
- BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)
BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...
- Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】
题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #includ ...
- luogu P4363 [九省联考2018]一双木棋chess
传送门 对抗搜索都不会,我真是菜死了qwq 首先根据题目条件,可以发现从上到下每一行的棋子数是单调不增的,然后n m都比较小,如果把状态搜出来,可以发现合法状态并不多,所以可以用一个11进制数表示状态 ...
- [九省联考2018]一双木棋chess
题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博 ...
- 洛谷P4363 一双木棋chess [九省联考2018] 搜索+hash
正解:记搜+hash 解题报告: 传送门! 因为看到nm范围特别小,,,所以直接考虑爆搜(bushi 先考虑爆搜之后再想优化什么的嘛QwQ 首先对这种都要最优的,就可以直接把答案设为针对某一方,然后题 ...
随机推荐
- MapReduce(2): How does Mapper work
In the previous post, we've illustrated how Hadoop MapReduce prepares input for Mappers. Long story ...
- VS2017使用assimp 5.0.0 error C2589: '(' : illegal token on right side of '::' 解决办法
坑爹微软Sucks Again. assimp 终于更新到了5.0.0并且支持GLTF2格式,包含动画正确解析,在viewer中也能看到正确结果,真他喵的不容易,然后拿来编译完到自己项目里用,就出这玩 ...
- mooc-IDEA 应用快捷键自动创建测试类--010
十六.IntelliJ IDEA -应用快捷键自动创建测试类 Step1:在类或接口上,按ctrl+shift+t 选择Create New Test... 则在相应测试包下.创建该测试类. 测试类:
- Linux Interactive Exploit Development with GDB and PEDA
Exploit Development Process● Occupy EIP● Find the offset(s)● Determine the attack vector● Build the ...
- python学习第二十九天函数局部变量如何改变外部变量
python函数局部变量如何改变外部变量,之前我说过,局部变量是没办法改变外部变量的,除非局部变量找不到,去外部找,输出变量,使用关键词global 使变量改变外部变量. 1,使用关键词global ...
- 数据仓库ETL案例学习(二)
来自案例学习 数据仓库经过ETL成功创建之后,就可以对数据仓库进行多维分析任务. 任务主要分为: 1.设置数据源,并添加分析时所需表到数据视图. 2.创建并设置维度. 3.设置时间维. 4.设置度量属 ...
- .net core 调用webservice同步方法
更新VS2019 16.1版本 支持WebService同步调用 在连接服务中->选择客户端选项->Generate Synchronout Operations选择划勾 生成同步操作 ...
- NGUI的anchors属性的使用
一,anchors锚点 我们需要明白target目标的使用,这时是你下面使用left,right,bottom和top的距离,比如我们使用目标为UI Root,这个就是摄像机的视野,所以,我们使用an ...
- REVOKE - 删除访问权限
SYNOPSIS REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRI ...
- ubuntu-12.04.5-desktop-amd64 安装vmwaretools
百度文库地址:https://wenku.baidu.com/view/7c1cd211a216147917112820.html 注意:一定要把此文档中的vmwaretools 版本号换成你自己下载 ...