九省联考2018 一双木棋
题目链接:戳我
我们容易知道,棋子的摆放形状应该是一个阶梯性(某dalao:来来来,轮廓线DP!)
我们选择用状态压缩来表示整个棋盘的排放形态(11进制压位,每个位上的数都表示一行的状态)
这样子我们每次对合法状态进行拓展,dfs搜索下去。轮到菲菲,我们期望她的得分大一些,而到牛牛,我们期望她的得分少一些。
所以我们对前者的cur_ans取max,后者的cur_ans取min(对抗搜索)
至于那个神奇的阿尔法-贝塔剪枝,我试了试,但是好像有点问题,所以WA了
加一个记忆化搜索——
貌似就可以过了......(可是时间复杂度看起来很不OK啊.......)
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define ull unsigned long long
#define base 11
#define MAXN 15
using namespace std;
int n,m;
int a[MAXN][MAXN],b[MAXN][MAXN],done[MAXN][MAXN],num[MAXN];
map<ull,int>sum;
inline ull calc()
{ull cur_ans=0;for(int i=1;i<=n;i++) cur_ans=cur_ans*base+num[i];return cur_ans;
}
inline void trans(ull x)
{for(int i=n;i>=1;i--){num[i]=x%base;x/=base;}
}
inline int search(ull x,int op)
{if(sum.count(x)) return sum[x];trans(x);int cur_ans;if(op==0) cur_ans=-0x3f3f3f3f;else cur_ans=0x3f3f3f3f;for(int i=1;i<=n;i++){if(num[i]<num[i-1]){ num[i]++;if(op==0) cur_ans=max(cur_ans,search(calc(),op^1)+a[i][num[i]]);else cur_ans=min(cur_ans,search(calc(),op^1)-b[i][num[i]]);num[i]--;}} sum[x]=cur_ans;// cout<<cur_ans<<endl;return cur_ans;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d",&n,&m);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]);for(int i=0;i<=n;i++) num[i]=m;sum[calc()]=0;// cout<<calc()<<endl;search(0,0);printf("%d\n",sum[0]);return 0;
}
转载于:https://www.cnblogs.com/fengxunling/p/10858470.html
九省联考2018 一双木棋相关推荐
- 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess
「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可 ...
- 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess
洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...
- p4363 [九省联考2018]一双木棋chess
传送门 分析 我们用0表示向右,1表示向上 于是可以得到一条江棋盘分为两块的线 直接dp即可 代码 #include<iostream> #include<cstdio> #i ...
- BZOJ5248:[九省联考2018]一双木棋——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5248 https://www.luogu.org/problemnew/show/P4363#su ...
- [LUOGU] P4363 [九省联考2018]一双木棋chess
题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这 ...
- luogu P4363 [九省联考2018]一双木棋chess
analysis 这是一道很好的状压dp 这个题首先需要分析出任何一个合法的状态都可以化为从左下角到右上角的一条对角线 这样一来状态就很好表示了: 我们考虑设f[s]表示从状态s出发,最后先手减后手的 ...
- [九省联考2018]一双木棋
先分析状态.画几张图你发现,一个合法的状态,它从第一行到第nnn行,每一行上棋子的数量一定是单调不增的,并且棋子一定是从左到右紧密排列. 写个dfsdfsdfs爆搜一下合法状态,最多也就181818万 ...
- [九省联考2018]一双木棋chess
题目 题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当 ...
- [九省联考2018]一双木棋chess——搜索+哈希
题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248 洛谷P4363 https://www.luogu.org/prob ...
最新文章
- mysql -p与密码之间不能有空格
- Eclipse OSGi调试过程
- 安卓ps2模拟器_安卓PSP模拟器评测:合金装备 和平步行者
- java 对象流传输socket_Java Socket(二)使用TCP传输对象
- 什么是E-MapReduce
- Javaspring 1-6课 基本概念及第一个Javaspring程序
- Armadillo的安装
- jpetstore学习第4章
- Java 理论与实践: 修复 Java 内存模型,第 1 部分
- nis从服务器接替nis主服务器步骤
- Centos7+搜狗拼音输入法 安装不踩雷
- 软件测试组工作计划,测试组长工作计划(共10篇).doc
- 电脑开机启动密码破解(win7,改sam没用)
- 在Vue中使用highlight.js
- java holder详解_connection holder is null 异常详解
- 不可思议有氧机器人_不思议迷宫机器人生产线选什么好 机器人合成公式一览...
- win10 计算机网络,win10网络发现已关闭网络计算机和设备不可见怎么办?
- 电商平台分析平台----需求六:实时统计之黑名单机制
- linux脚本的编写
- #1045 无法登录 MySQL 服务器(实际上是我第一次使用,不知道密码)
热门文章
- 蓝湖下载的切图比较模糊
- 云电脑的四重守护,安全有谱
- 从零开始的腾讯云使用体验-2-zsh安装与插件扩展、docker安装与基本使用
- jQuery计时器插件
- 求浆得酒,能获得如此好运,也当为大家做些什么
- java程序毕设javaweb程序分享
- could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
- 读书笔记:Jack,杰克韦尔奇自传
- 寿星万年历---java算法实现
- drm例子modeset-plane-test