P4363 [九省联考2018]一双木棋chess
思路
容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示
转移就是10变成01
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
// #define int long long
using namespace std;
int A[20][20],B[20][20],n,m;
//map<int,int> M,vis;
int M[(1<<21)],vis[(1<<21)];
void print(int x){
for(int i=n+m-1;i>=0;i--)
printf("%d",(x>>i)&1);
putchar('\n');
}
int dfs(int state,int which){//0 feifei 1 niuniu
// print(state);
// printf("which:%d\n",which);
// getchar();
if(vis[state]){
// printf("req=%d\n",M[state]);
return M[state];
}
vis[state]=true;
int x=m,y=0;
int mid;
if(!which)
mid=-0x3f3f3f3f3f3f3f3fLL;
else
mid=0x3f3f3f3f3f3f3f3fLL;
for(int i=0;i<n+m;i++){
if((i+1)<n+m&&((state>>i)&1)==0&&((state>>(i+1))&1)==1){
// printf("y=%d x=%d\n",y+1,x);
int to=state^(3<<i);
if(!which)
mid=max(mid,dfs(to,which^1)+A[y+1][x]);
else
mid=min(mid,dfs(to,which^1)-B[y+1][x]);
// printf("mid=%d\n",mid);
}
if((state>>i)&1)
y++;
else
x--;
}
M[state]=mid;
// printf("req=%d\n",M[state]);
return mid;
}
signed main(){
// freopen("test.in","r",stdin);
scanf("%d %d",&n,&m);
// int t=clock();
int st=(((1<<(n))-1)<<m),end=(1<<n)-1;
// print(st);
// print(end);
vis[end]=true;
M[end]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&A[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&B[i][j]);
}
}
printf("%d\n",dfs(st,0));
// printf("time=%lf\n",1.0*(clock()-t)/CLOCKS_PER_SEC);
return 0;
}
P4363 [九省联考2018]一双木棋chess的更多相关文章
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 题解
题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...
- luogu P4363 [九省联考2018]一双木棋chess
传送门 对抗搜索都不会,我真是菜死了qwq 首先根据题目条件,可以发现从上到下每一行的棋子数是单调不增的,然后n m都比较小,如果把状态搜出来,可以发现合法状态并不多,所以可以用一个11进制数表示状态 ...
- 【题解】Luogu P4363 [九省联考2018]一双木棋chess
原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...
- P4363 [九省联考2018]一双木棋chess(对抗搜索+记忆化搜索)
传送门 这对抗搜索是个啥玩意儿…… 首先可以发现每一行的棋子数都不小于下一行,且局面可由每一行的棋子数唯一表示,那么用一个m+1进制数来表示当前局面,用longlong存,开map记忆化搜索 然后时间 ...
- P4363 [九省联考2018]一双木棋
题面 这种搜索要把后继状态都跑出来之后取Min/Max 也就是回溯的时候进行操作 记得用hash进行记忆化(用map不开O2会TLE) #include<iostream> #includ ...
- BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)
BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...
- [九省联考2018]一双木棋chess——搜索+哈希
题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/prob ...
随机推荐
- html5-css边框全
/*div{ width: 500px; height: 300px; background: rgb(122,30,60); border: 10px solid black ...
- MySQL存储引擎MyISAM与InnoDB区别总结整理
在MySQL的 可重复读隔离级别 中,是解决了幻读的读问题的. 1. MySQL默认存储引擎的变迁 在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默 ...
- 基于EOS开发的Dapp大全
基于EOS开发的Dapp大全 截止20180424,基于EOS开发的项目在50,很多项目的规划信息还不完善,搜集了基本的信息,供大家参考. ==========================长期囤币 ...
- bzoj3196 二逼平衡树
题目链接 平衡树系列最后一题 坑啊 10s时间限制跑了9764ms...还是要学一学bit套主席树啦... 经典的线段树套treap...至于第一发为什么要TLE(我不会告诉你treap插入的时候忘了 ...
- linux利用scp远程上传下载文件/文件夹
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度. 当你服务 ...
- 关于reduce输出write方法
关于hadoop一些自定义输出 code>OutputFormat</code> describes the output-specification for a * Map-Red ...
- 每日linux命令学习-xargs命令
xargs命令 xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据 ...
- 2019/3/19 wen 运算符
- 3、pandas的loc和iloc数据筛选
选择列: 选择一列: 选择多列(选择的内容变成list,也就是要两个方括号): 选择一行或多行(loc函数): 选择连续的行(以索引标签为选择参数): 选择非连续的行(以索引标签为选择参数): 选择包 ...
- python3 独立环境 virtualenv & conda
python3 独立环境 virtualenv & conda virtualenv 创建独立python环境 virtualenv env_name -p /usr/bin/python3 ...