首页 > 其他分享 >P4363 [九省联考 2018] 一双木棋 题解

P4363 [九省联考 2018] 一双木棋 题解

时间:2022-09-02 19:47:05浏览次数:79  
标签:fir sta int 题解 木棋 sec 联考 Plozia

一道状压 dp 题,我写的记忆化搜索。

注意到这道题已经下子的区域和未下子的区域有一条轮廓线分割,因此考虑右上到左下记纵向为 1,横向为 0,状压一下,然后顺着记忆化搜索(有点类似 alpha-beta 对抗搜索),如果是先手答案就取 max,后手答案就取 min,每次转移时找到纵+横的位置改变状态转移即可。

注意倒着搜是不行的,因为倒着搜时你无法确定从哪一个状态转移是最优的(考虑后效性),但是正着搜可以保证未完成部分对自己是最优的。

Github:CodeBase-of-Plozia

Code:

/*
========= Plozia =========
	Author:Plozia
	Problem:P4363 [九省联考2018]一双木棋chess
	Date:2021/8/11
========= Plozia =========
*/

#include <bits/stdc++.h>

typedef long long LL;
const int MAXN = 15, MAX_State = 1 << 20, INF = 0x7f7f7f7f;
int n, m, a[MAXN][MAXN], b[MAXN][MAXN], f[MAX_State];
bool book[MAX_State];

int Read()
{
	int sum = 0, fh = 1; char ch = getchar();
	for (; ch < '0' || ch > '9'; ch = getchar()) fh -= (ch == '-') << 1;
	for (; ch >= '0' && ch <= '9'; ch = getchar()) sum = sum * 10 + (ch ^ 48);
	return sum * fh;
}
int Max(int fir, int sec) { return (fir > sec) ? fir : sec; }
int Min(int fir, int sec) { return (fir < sec) ? fir : sec; }

int dfs(int sta, int who)
{
	if (book[sta]) return f[sta];
	f[sta] = (who == 0) ? -INF : INF; book[sta] = 1;
	int x = 0, y = m;
	for (int i = n + m - 1; i >= 0; --i)
	{
		if (sta & (1 << i)) ++x; else --y;
		if ((sta & (1 << i)) && !(sta & (1 << (i + 1))) && (i != n + m - 1))
		{
			int s = sta ^ (1 << i) ^ (1 << (i + 1));
			if (who == 0) f[sta] = Max(f[sta], dfs(s, who ^ 1) + a[x][y + 1]);
			else f[sta] = Min(f[sta], dfs(s, who ^ 1) - b[x][y + 1]);
		}
	}
	return f[sta];
}

int main()
{
	n = Read(), m = Read();
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j)
			a[i][j] = Read();
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j)
			b[i][j] = Read();
	int sta = 0;
	sta = ((1 << n) - 1) << m; book[sta] = 1;
	f[sta] = 0; printf("%d\n", dfs((1 << n) - 1, 0));
	return 0;
}

标签:fir,sta,int,题解,木棋,sec,联考,Plozia
From: https://www.cnblogs.com/Plozia/p/16651013.html

相关文章

  • codeforces极简题解
    CF1713F利用lucas定理,\(b_S\)表示下标\(T\)与\(S\)无交的\(a_T\)的异或,由于部分\(b_S\)未知,不能直接iFWT。回顾容斥:\([S=\emptyset]=\sum_{T\subseteqS}(-1)^|T|\),\([n=0......
  • NOI2022(部分)题解
    D1T1:严格众数有一种处理方法就是摩尔投票法:既然这个众数\(x\)出现了超过\(\dfracn2\)次,那么我们每次把一个非众数\(y\)和\(x\)消掉,即使是在最劣情况下,最后一定......
  • 第一场排位赛题解
    总结阅读能力需要加强这场的题除了最后一题图论建议都补了A-WilburandSwimmingPool在一个二维平面中有一个四边平行于坐标轴的矩形,给出\(1-4\)个坐标,分别对应......
  • 题解 UVA1343 The Rotation Game
    题解区都是\(\text{IDA*}\),实际上这题\(\text{A*}\)也可以,代码也很简单。Solution首先由于整个棋盘的形状是已知的,所以我们可以先处理出\(\text{A~H}\)操作对应行列......
  • CF1722G 题解
    题目构造一个长度为\(n\)的数列,数列中每个数各不相同且都不超过\(2^{31}\),使得奇数项和偶数项的异或和相等。思路我提供一种比较神奇的构造方法。首先,两个数相等可......
  • CF351B Jeff and Furik 题解
    CF351BJeffandFurik有一个长度为n的排列p,Jeff每次操作选两个相邻元素交换,Furik每次操作随机执行下列操作之一:1.对于所有p[i]<p[i+1],随机取一对p[i]与p[i+1]交换2.......
  • onenote突然无法同步,同步报错以及创建笔记本都报错问题解决
    同步报错:OneNote当前无法同步笔记。将继续尝试。(错误代码:0x80004005bdf5j)创建笔记本报错:OneNote无法在以下位置新建笔记本打开笔记本报错:无法打开笔记本无法打开......
  • hzx的CSP-J模拟赛题解
    T1按题意模拟即可,注意不用考虑闰年。T2\(30\%\)的数据:使用\(Floyd\)求出图的全源最短路,时间复杂度\(O(n^3)\)。\(50\%\)的数据:对图上每个点使用\(Dijkstra\)求......
  • P1004 [NOIP2000 提高组] 方格取数 题解
    [NOIP2000提高组]方格取数题目描述设有\(N\timesN\)的方格图\((N\le9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\)。如下图所示(见样例):......
  • iOS自动化真机测试验证环境过程中常见问题解析
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取本章节主要讲解iOS自动化真机配置以及在iOS真机执行自动化时常见问题与解决方法。真机使......