「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

学校省选模拟居然拿九省联考来考

然而我还是\(too\space young\),搞不懂什么叫最优

让二者的答案最接近可以拿到\(25\)分的好成绩


problem

Solution

首先可以知道菲菲想要最大化\(ans=Ansa-Ansb\),牛牛想要最小化

那么我们可以用对抗搜索大力爆搜

可以拿到50分

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;template <typename T> void read(T &t)
{t=0;int f=0;char c=getchar();while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){t=t*10+c-'0';c=getchar();}if(f)t=-t;
}const int maxn=15,maxm=15;
int n,m;
int A[maxn][maxm],B[maxn][maxm];
int ocr[maxn][maxm];int dfs(int step)
{if(step==n*m+1)return 0;int re=0;if(step&1)re=-0x3f3f3f3f;else re=0x3f3f3f3f;for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)if(!ocr[i][j] && ocr[i-1][j] && ocr[i][j-1]){ocr[i][j]=1;if(step&1)re=max(re,dfs(step+1)+A[i][j]);else re=min(re,dfs(step+1)-B[i][j]);ocr[i][j]=0;}return re;
}int main()
{read(n);read(m);for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)read(A[i][j]);for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)read(B[i][j]);for(register int i=0;i<=n;++i)ocr[i][0]=1;for(register int i=0;i<=m;++i)ocr[0][i]=1;printf("%d",dfs(1));return 0;
}

显然这个东西可以记忆化一下

用\(map\)存一下棋盘的哈希值,吸氧的情况下是能A掉的

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;template <typename T> void read(T &t)
{t=0;int f=0;char c=getchar();while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){t=t*10+c-'0';c=getchar();}if(f)t=-t;
}const int maxn=15,maxm=15;int n,m;
int A[maxn][maxm],B[maxn][maxm];
int ocr[maxn][maxm];
map<ull,int> rec;ull Hash()
{ull re=0;for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)re=re*3ull+ocr[i][j];return re;
}int dfs(int step)
{if(step==n*m+1)return 0;int re=0;ull h=Hash();if(rec.find(h)!=rec.end())return rec[h];if(step&1)re=-0x3f3f3f3f;else re=0x3f3f3f3f;for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)if(!ocr[i][j] && ocr[i-1][j] && ocr[i][j-1]){ocr[i][j]=1;if(step&1)re=max(re,dfs(step+1)+A[i][j]);else re=min(re,dfs(step+1)-B[i][j]);ocr[i][j]=0;}return rec[h]=re;
}int main()
{read(n);read(m);for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)read(A[i][j]);for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)read(B[i][j]);for(register int i=0;i<=n;++i)ocr[i][0]=1;for(register int i=0;i<=m;++i)ocr[0][i]=1;printf("%d",dfs(1));return 0;
}

经过百度一下之后,发现此类对抗搜索还有一种优化,叫做\(Alpha-Beta\)优化

在此仅放上介绍链接,不再赘述

对于此题,我们如果使用\(Alpha-Beta\)优化,也能获得70分的成绩

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;template <typename T> void read(T &t)
{t=0;int f=0;char c=getchar();while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){t=t*10+c-'0';c=getchar();}if(f)t=-t;
}const int maxn=15,maxm=15;int n,m;
int A[maxn][maxm],B[maxn][maxm];
int ocr[maxn][maxm];const int inf=0x3f3f3f3f;int dfs(int step,int alpha,int beta,int nowa,int nowb)
{if(step==n*m+1)return nowa-nowb;if(step&1){for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)if(!ocr[i][j] && ocr[i-1][j] && ocr[i][j-1]){ocr[i][j]=1;alpha=max(alpha,dfs(step+1,alpha,beta,nowa+A[i][j],nowb));ocr[i][j]=0;if(alpha>=beta)return alpha;}return alpha;}else{for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)if(!ocr[i][j] && ocr[i-1][j] && ocr[i][j-1]){ocr[i][j]=1;beta=min(beta,dfs(step+1,alpha,beta,nowa,nowb+B[i][j]));ocr[i][j]=0;if(alpha>=beta)return beta;}return beta;}
}int main()
{read(n);read(m);for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)read(A[i][j]);for(register int i=1;i<=n;++i)for(register int j=1;j<=m;++j)read(B[i][j]);for(register int i=0;i<=n;++i)ocr[i][0]=1;for(register int i=0;i<=m;++i)ocr[0][i]=1;printf("%d",dfs(1,-inf,inf,0,0));return 0;
}

转载于:https://www.cnblogs.com/lizbaka/p/10520853.html

「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess相关推荐

  1. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  2. BZOJ5248:[九省联考2018]一双木棋——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...

  3. [九省联考2018]一双木棋chess——搜索+哈希

    题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/prob ...

  4. p4363 [九省联考2018]一双木棋chess

    传送门 分析 我们用0表示向右,1表示向上 于是可以得到一条江棋盘分为两块的线 直接dp即可 代码 #include<iostream> #include<cstdio> #i ...

  5. [LUOGU] P4363 [九省联考2018]一双木棋chess

    题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这 ...

  6. luogu P4363 [九省联考2018]一双木棋chess

    analysis 这是一道很好的状压dp 这个题首先需要分析出任何一个合法的状态都可以化为从左下角到右上角的一条对角线 这样一来状态就很好表示了: 我们考虑设f[s]表示从状态s出发,最后先手减后手的 ...

  7. [九省联考2018]一双木棋chess

    题目 题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当 ...

  8. [九省联考 2018] 一双木棋chess

    题目描述: 有一个 n∗m的方格, Alice 和 Bob 玩游戏.每次每人可以选择一个格子占领,前提是这个格子未被占领且它左上方的所有格子都已被占领. 第 i行第 j 列的格子若被 Alice 占领 ...

  9. 洛谷P4363 [九省联考2018]一双木棋chess

    题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当 ...

最新文章

  1. java 图片传输方式_Java图像传输方法
  2. joda time, jackson 与 scala 反射
  3. OneAPM挂牌新三板,续写ITOM新篇章
  4. ML之LiRDNNEL:基于skflow的LiR、DNN、sklearn的RF对Boston(波士顿房价)数据集进行回归预测(房价)
  5. mysqld服务启动失败, Failed to restart mysqld.service: Unit not found.
  6. python的pass在函数中的作用_Pass Share:Python / Julia 中函数变量的传递机制
  7. 荣耀V40屏幕素质得到“认证”:120Hz高刷屏没跑了
  8. 分治法 —— 快速排序和归并排序(自底向上和自顶向下)
  9. 深入学习Java中的字符串,代码点和代码单元
  10. cygwin 'unable to remap' issue
  11. 北京今日起最低工资和养老金标准全部上调
  12. Win10下安装GrADS
  13. 创建pytorch虚拟环境的版本问题
  14. C语言函数:even(n),fflush(stdin)
  15. BH1750 STM32 驱动程序
  16. 微信小程序开发常见问题总结
  17. sql导入数据以及列表编号设置自动填充
  18. vue-electron制作网易云音乐客户端
  19. halocn标定找旋转中心_一种利用旋转中心进行手眼标定的原理性介绍
  20. STM32——MG90S数字舵机驱动

热门文章

  1. 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码
  2. Django 运行报错 Manager isnt accessible via Category instances
  3. Material Design中的Elevation和shadows
  4. 推导产生的promise
  5. System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同。 (Microsoft.SqlServer.Smo)...
  6. 微型torch去马赛克setup.py运行笔记
  7. 华证ESG评级数据2009-2022年:季度评级、年末评级、季度平均得分
  8. bam获取序列_如何高效地从BAM文件中提取fastq
  9. 基于OpenGL的Koch分形雪花实现
  10. 华硕笔记本扇热声音大