[BZOJ5248][多省联测2018]双木棋chess
sol
首先,要保证一个格子的左边和上方都放满了棋子,就需要这个点的左上方那个矩形都放满了棋子。
这样放棋子状态就会是一个自左下至右上的轮廓线。
状态数?\(C_{20}^{10}\)。相当于是从左下角走到右上角一共要走\(20\)步,在其中选出\(10\)向上走其余的向右走。
也可以打个表看一看。。。
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[20],tot;
void dfs(int u)
{
	if (u==n+1) {++tot;return;}
	for (int i=a[u-1];i<=m;++i)
		a[u]=i,dfs(u+1);
}
int main()
{
	n=10;m=10;dfs(1);
	printf("%d\n",tot);
	return 0;
}
这里打表打的就是\(10\)个\([0,10]\)整数单调不降的方案数。
运行结果:
184756
既然状态数这么少就直接\(hash\)一下然后\(map\)存啊。
把既然是\([0,10]\)的整数就把它压成一个\(11\)进制的数,显然并不会爆long long。
可以直接\(dp\)。判断一下当前状态是先手还是后手进行操作,如果是先手操作就是从所有后继状态的\(dp\)值中取\(\max\),否则就是取\(\min\)。
code
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
int gi()
{
	int x=0,w=1;char ch=getchar();
	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if (ch=='-') w=0,ch=getchar();
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return w?x:-x;
}
const int N = 20;
const int inf = 2e9;
int n,m,A[N][N],B[N][N],a[N];
map<ll,int>M;
ll hash()
{
	ll res=0;
	for (int i=1;i<=n;++i) res=res*11+a[i];
	return res;
}
void unpack(ll zt)
{
	for (int i=n;i;--i) a[i]=zt%11,zt/=11;
}
int dfs(ll zt)
{
	if (M.find(zt)!=M.end()) return M[zt];
	unpack(zt);int t=0,res;
	for (int i=1;i<=n;++i) t^=a[i]&1;
	res=t?inf:-inf;
	for (int i=1;i<=n;++i)
		if (a[i-1]>a[i])
		{
			++a[i];
			ll nxt=hash();
			if (t) res=min(res,dfs(nxt)-B[i][a[i]]);
			else res=max(res,dfs(nxt)+A[i][a[i]]);
			--a[i];
		}
	return M[zt]=res;
}
int main()
{
	n=gi();m=gi();a[0]=m;
	for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) A[i][j]=gi();
	for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) B[i][j]=gi();
	for (int i=1;i<=n;++i) a[i]=m;M[hash()]=0;
	printf("%d\n",dfs(0));return 0;
}
[BZOJ5248][多省联测2018]双木棋chess的更多相关文章
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
		P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ... 
- 洛谷P4363 一双木棋 chess
		洛谷P4363 一双木棋 chess 省选最水的一道题了. 且看我数个月AC一道题...... 具体是这样的:我们发现这个下了棋的地方一定形成一个锯齿形,那么怎么状态压缩呢? 维护轮廓线! 从左下角出 ... 
- bzoj5248 [2018多省省队联测]一双木棋
		直接hash+爆搜即可. #include <cstdio> #include <cstring> #include <iostream> #include < ... 
- bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋
		https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ... 
- B5248 [2018多省省队联测]一双木棋 状压dp
		这个题当时划水,得了二十分,现在来整一整. 这个题用状压来压缩边界线,然后通过记忆化搜索进行dp.我们可以观察到,其实每次转移,就是把一个1向左移一位.最后的状态设为0. 这其中还要有一个变量来记录谁 ... 
- bzoj 5248: [2018多省省队联测]一双木棋
		Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ... 
- BZOJ 5248: [2018多省省队联测]一双木棋(对抗搜索)
		Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 439 Solved: 379[Submit][Status][Discuss] Descriptio ... 
- 【刷题】BZOJ 5248 [2018多省省队联测]一双木棋
		Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ... 
- 【题解】Luogu P4363 [九省联考2018]一双木棋chess
		原题传送门 这道题珂以轮廓线dp解决 经过推导,我们珂以发现下一行的棋子比上一行的棋子少(或等于),而且每一行中的棋子都是从左向右依次排列(从头开始,中间没有空隙) 所以每下完一步棋,棋盘的一部分是有 ... 
随机推荐
- bfc (收集的)
			一些基本概念 viewport: 展现网页的媒体,比如窗口或者某个区域,它的大小是有限制的,为了不被平台术语所束缚,我们给他起名viewport,中文意思就是视口. canvas: 而我们在渲染网页的 ... 
- OC自动释放池autoreleasepool介绍
			自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存. @autoreleasepool { statements } 在创建新对象时,并且系统未启动ARC特性,那么在使用 ... 
- iOS获取设备IP地址
			项目用到要获取iOS设备的IP地址,有2种方法: 1)第一种比较简单,但是只有当你的设备连接到WIFI时才能获取到IP地址,倘若你的设备用的是流量,那就不行.代码如下: #import <ifa ... 
- Eclipse Class Decompiler——Java反编译插件
			http://www.blogjava.net/cnfree/archive/2012/10/30/390457.html Eclipse Class Decompiler是一款Eclipse插件,整 ... 
- CSS实现三角形图标的原理!!!!今天总算弄懂了。
			网页中经常有一种三角形的图标,鼠标点一下会弹出一个下拉菜单之类的(之前淘宝也有,不过现在改版好像没有了) 之前以为是个png图标背景,后来在bootstrap中看到有一个图标样式叫做caret的用来实 ... 
- 七、golang中接口、反射
			一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ... 
- Cocos2d-x项目移植到WP8系列之四:文件操作
			原文链接: http://www.cnblogs.com/zouzf/p/3972457.html 读写文件Cocos已经用fopen fwrite来做好了,这里说的主要是文件和文件夹的创建.删除.判 ... 
- 使用fastboot刷机流程【转】
			本文转载自:http://www.voidcn.com/blog/Qidi_Huang/article/p-6236224.html [准备工作] 首先需要准备好刷机包,可以是自己编译的,也可以是从别 ... 
- K8s ipvs mode kube-proxy
			IPVS vs. IPTABLES IPVS模式在Kubernetes 1.8中被引入,在1.9中进入beta测试. IPTABLES模式在1.1版本中被添加进来,在1.2开始就变成了默认的操作模式. ... 
- CentOS防火墙iptables-config的相关配置参数详解
			默认/etc/sysoncifg/iptables-config的配置内容: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ... 
