首页 > 其他分享 >ABC278F 题解

ABC278F 题解

时间:2022-11-21 10:03:11浏览次数:77  
标签:puts 题解 状压 dfs ABC278F 选过

前言

题目传送门!

或许更好的阅读体验?

博弈论,状压,记忆化搜索。

思路

看到很小的 \(n\),容易联想到状压、搜索。本题就是状压加搜索。

设状态 \(x\) 的每一位表示:如果第 \(i\) 位是 \(0\),则当前数没有被选过。否则已经选过了。

每次 dfs 的时候,记录当前状态,以及上一次选的字符串。

如果有一种情况能使对手必败,那么我们就必胜。如果所有情况都是对手胜,那么我们必败。

注意要记忆话,否则会被卡到 \(O(n!)\) 然后 TLE 几个点。

代码

省去了大段的缺省源。

const int N = 17;
int n;
string a[N];

bool vis[1 << N][N], ans[1 << N][N]; //vis 是看 ans 有没有出现过
bool dfs(int x, int lst) //x 是状压
{
	if (vis[x][lst]) return ans[x][lst]; //记忆化搜索
	for (int i = 1; i <= n; i++)
		if ( !(x & (1 << (i - 1))) ) //意思:x的第i位是0
			if (lst == 0 || a[lst][a[lst].length() - 1] == a[i][0]) //如果可以接上去
				if ( !dfs(x | (1 << (i - 1)), i) ) //尝试接
					{vis[x][lst] = true; return ans[x][lst] = true;}  //对手必败,说明我方必胜
	vis[x][lst] = true; return ans[x][lst] = false; //怎样都是对手胜,那么我们必败
}
void solve()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) cin >> a[i];

	if (dfs(0, 0)) puts("First");
	else puts("Second");
}

希望能帮助到大家!

标签:puts,题解,状压,dfs,ABC278F,选过
From: https://www.cnblogs.com/liangbowen/p/16910421.html

相关文章

  • [ARC152D] Halftree题解
    很好的一道题,即使是我这种菜鸡也感到心潮澎湃。直觉有余,证明不足。思路有余,推导不足。无论是什么比赛,对拍都是最有效的查错方式。本篇题解里的所有图片采用gra......
  • ABC278D 题解
    前言题目传送门!更好的阅读体验?难度加强版:P1253。思路很容易想到线段树。维护\(cov_i\)表示覆盖的懒标记。单点加与单点查都非常简单。全局覆盖只需要给每一层都打......
  • CF1383E Strange Operation 题解
    linkSolutionshaber题,但是又没有做出来。我们发现这个变化相当于可以任意删掉\(0\),\(1\)的话只有与\(1\)相邻的时候可以删掉。那么相当于我们可以把一段包含\(1\)......
  • [题解] Uoj Easy Round 11
    A使用动态规划,\(f_{i,j}\)代表竖着的前\(i\)个,第\(i\)个被第\(j\)个横着的挡住的方案数,当然前提是有\(l_j\gei\),否则\(f_{i,j}=0\)。转移就是做一遍前缀和。考......
  • ABC245G题解
    似乎是经典套路?先不考虑颜色限制,那么就直接把\(l\)个关键点当作起点跑多源最短路就行了。现在考虑颜色限制,有一种暴力的想法是枚举所有颜色,只把这种颜色的点当作起点,然......
  • Codeforces 1740 F Conditional Mix 题解
    题目链接对于任意一个multiset,我们都把它的元素从大到小排序来观察。发现一个multiset合法有个必要条件:对于每个i,multiset中最大的i个元素之和不能超过\(lim_i\),如果令\(c......
  • 「NOIP赛前冲刺」ABC278F
    Solution简单状态压缩,考虑设\(f_{S,i}\)表示状态为\(S\)并且当前要求一个开头为\(s_i\)的结尾字符的单词,\(\text{First}\)如果能赢为\(0\),否则为\(1\)。那么很......
  • 2022/11/20 集训题解 Longest Loose Segment
    linkDescription定义\(a_{1,2,...,m}\)为好序列当且仅当\(\maxa_i+\mina_i>m\),给出一个长度为\(n\)的序列,问最长好序列子段长度。有\(T\)次修改。\(n\le10^6,......
  • P4047 [JSOI2010]部落划分 题解
    最小生成树做法之Kruskal算法流程(详细分析请看代码注释):1.初始化并查集并查集模板不过多解释,还不懂请参阅并查集-OIWiki。每个节点的祖先最开始都是自己。还有......
  • U255813 争宠题解
    题目传送门#include<bits/stdc++.h>usingnamespacestd;voidjia(strings1,strings2){boolaaa=0;inta[5010],b[5010],c[5010];memset(a,0,sizeof(......