洛谷P4363 一双木棋 chess
洛谷P4363 一双木棋 chess
省选最水的一道题了。
且看我数个月AC一道题......
具体是这样的:
我们发现这个下了棋的地方一定形成一个锯齿形,那么怎么状态压缩呢?
维护轮廓线!
从左下角出发,向上为1,向右为0即可。
然后我们就开心的DP…等等
这按照什么顺序DP啊!!
好,那么我们退而求次,记忆化搜索!
然后就没有然后了…
需要注意的地方:
- 记得判断max还是min
- 二进制位运算一如既往的烦人
- DFS起点和终点的处理
- 求最大差值,转化为加A减B即可
那么我们调了一年后终于A了!!
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = ,INF = 0x7f7f7f7f;
int m,n,mp[<<],A[N][N],B[N][N],aim; bool who(int sta) { //判断该谁走的函数
int p=m,ans=;
while(sta) {
if(sta&) {
ans+=p;
}
else {
p--;
}
sta=sta>>;
}
return !(ans&);
} void out(int sta) { //输出这个状态(二进制)
int t[],T=;
fill(t,t+,);
while(sta) {
t[++T] = bool(sta&);
sta=sta>>;
}
printf(" ");
for(int i=m+n;i>=;i--) {
printf("%d",t[i]);
}
printf(" ");
return;
} int DFS(int now) { ///printf("DFS\n"); if(mp[now]) { // 记忆化
return mp[now];
}
if(now==aim) {
return ;
} bool f = who(now);
int p=,ans=(f?(-INF):INF);
for(int i=;i<m+n;i++) {
if(now&(<<i)) {
p++;
} // gay
if((!(now&(<<i)))&&(now&(<<(i+)))) { /* 10 */ /** 10 */ /// [p+1][m+p-i]
int nextsta = (now|(<<i))&(~(<<(i+)));
int x=p+;
int y=m+p-i;
if(f) {
ans=max(ans,DFS(nextsta)+A[x][y]);
}
else {
ans=min(ans,DFS(nextsta)-B[x][y]);
}
}
}
mp[now]=ans;
//printf("DFS:");
//out(now);
//printf("\n");
return ans;
} int main(){
scanf("%d%d",&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]);
}
}
int s=; // 起点
for(int i=;i<=n;i++) {
aim=aim<<|; // 终点
s=s<<|;
}
for(int i=;i<=m;i++) {
s=s<<;
} printf("%d",DFS(s)); return ;
}
AC代码
洛谷P4363 一双木棋 chess的更多相关文章
- 洛谷P4363 一双木棋chess [九省联考2018] 搜索+hash
正解:记搜+hash 解题报告: 传送门! 因为看到nm范围特别小,,,所以直接考虑爆搜(bushi 先考虑爆搜之后再想优化什么的嘛QwQ 首先对这种都要最优的,就可以直接把答案设为针对某一方,然后题 ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...
- 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 ...
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 题解
题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...
- 【题解】Luogu P4363 [九省联考2018]一双木棋chess
原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ...
- luogu P4363 [九省联考2018]一双木棋chess
传送门 对抗搜索都不会,我真是菜死了qwq 首先根据题目条件,可以发现从上到下每一行的棋子数是单调不增的,然后n m都比较小,如果把状态搜出来,可以发现合法状态并不多,所以可以用一个11进制数表示状态 ...
- P4363 [九省联考2018]一双木棋chess
思路 容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示 转移就是10变成01 代码 #include <cstdio> #include <algo ...
随机推荐
- vue 项目使用 webpack 构建自动获取电脑ip地址
1.开发 H5 时移动端,经常会使用真机进行调试本地环境.webpack 配置服务器好多脚手架写的都是固定的,而在团队开发中需要每人配置自己的本机 ip 进行开发,每次开启开发环境的都需要修改,并且还 ...
- Django框架导读
1.虚拟环境的安装 2.web应用 C/S B/S 架构 3.http协议介绍 4.状态码 5.原生socket 6.框架演变 7.项目演变 一.虚拟环境安装 什么是虚拟环境? 1.对真实环境的一个 ...
- 网站滚动n个像素后,头部固定
//固顶 $(window).scroll(function() { var top = $(window).scrollTop(); if(top>=1200){ $(".x_men ...
- Delphi中Owner和Parent的区别
Owner为创建者,Parent为容器 他们的类型不同,Owner为TComponent(元件),Parent为TWinControl(窗体控件) Parent属性是指构件的包容器,构件只能在此范围内 ...
- springboot+jpa+mysql+swagger整合
Springboot+jpa+MySQL+swagger整合 创建一个springboot web项目 <dependencies> <dependency> < ...
- Js--动态生成表格
<div> <h1>动态生成表格</h1> <div id="table1"> 行 ...
- oracle ceil函数
ceil和floor函数在一些业务数据的时候,有时还是很有用的. ceil(n) 取大于等于数值n的最小整数: floor(n)取小于等于数值n的最大整数 如下例子 SQL> select ce ...
- Directory of X:\EFI\Microsoft\Boot
Directory of X:\EFI\Microsoft\Boot 2017/06/21 15:14 <DIR> . 2017/06/21 15:14 <DIR> .. 20 ...
- Modbus CRC 16 (C#)
算法 1.预置一个值为 0xFFFF 的 16 位寄存器,此寄存器为 CRC 寄存器. 2.把第 1 个 8 位二进制数据(即通信消息帧的第 1 个字节)与 16 位的 CRC 寄存器相异或,异或的结 ...
- Ubuntu开发用新机安装流程
1.SSH安装 Ubuntu缺省已安装客户端,此处安装服务端 sudo apt-get install openssh-server 确认sshserver是否启动 netstat -tlp | gr ...