一双木棋(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 首先对这种都要最优的,就可以直接把答案设为针对某一方,然后题 ...
随机推荐
- 16/7/14-MySQL-遇到的基本问题
从一开始遇到的3534 ---------------------------------------------------------------------------------------- ...
- JSP中四种属性保存范围(1)
一.四种属性范围 在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效request:在一次服务请求范围内,服务器跳转后依然有效session:-在一次会话范围内,无论何种跳 ...
- 设置chrome解决跨域问题
开发中遇到跨域问题, 解决方法一 以关闭安全验证模式启动chrome,就不会报跨域了 开发阶段,用这个方式是可以的,不然他需要后台配置成 * , 发布会有风险 设置方法: --disable-w ...
- Codeforces Round #285 (Div. 2)C. Misha and Forest(拓扑排序)
传送门 Description Let's define a forest as a non-directed acyclic graph (also without loops and parall ...
- JS动态添加Easyui的HTML时样式丢失
解决办法: $.parser.parse($("#creatLi").html(<li>xxxxxx</li>)); ------------------- ...
- java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 ...
- SQL 日期格式化与格式转化
日期格式化 Select CONVERT(varchar(), GETDATE(), ): :57AM Select CONVERT(varchar(), GETDATE(), ): // Selec ...
- 暂时放弃ts版个人博客转js版博客
我本打算信心满满的做个vue+ts做个博客的,其实架构搭的差不多了,但是我在用vuex的时候发现一个自己无法忍受的瑕疵,那就是在用vuex的时候,得利于普通版vuex的map语法糖实在太好用,这把我惯 ...
- 常见前端面试题JS部分
1.闭包 2.JS操作和获取cookie //创建cookie function setCookie(name, value, expires, path, domain, secure) { var ...
- 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)
前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...