首页 > 其他分享 >题解 石头剪刀布

题解 石头剪刀布

时间:2023-08-17 21:13:50浏览次数:42  
标签:int 题解 omega 吊打 leq 序列 石头 剪刀

plaese kill me. && don't forget me.


题目描述

给定 \(n\) 个字符串 \(s_i\) 只包含 0,1,2,现在要捏一个序列 \(A\),\(s_i\) 表示 \(a_i\) 可以捏成什么。1,2,3 形成环形吊打关系,\(\omega(X)\) 表示序列 \(X\) 最长的吊打子序列,吊打序列指的是对于 \(a_{p_1},\dots,a_{p_k}\) ,除了首位每一位都被前一个吊打。求对于 \(t=1,\dots,n\) 满足 \(\omega(A)=t\) 的 \(X\) 有多少个。

\(n\leq 2000\)


题解

先考虑给定一个序列 \(\omega(A)\) 怎么求,简单 dp,设 \(f[i][0/1/2]\) 表示前 \(i\) 位以 \(0/1/2\) 结尾的最长长度,假设 \(x\) 吊打 \(y\),\(f[i][y]=\max\{f[j][x]+1\}\)。

发现关心 \(f[i][0/1/2]\),那么弄更好做的状态 \(g[i][x][y][z]\) 表示前 \(i\) 位以 \(0/1/2\) 结尾的吊打子序列最长为 \(x/y/z\) 的方案数,转移就跟自己和吊打 add1 取 max 就可以啦 qwq

然后到了喜闻乐见的优化环节,题目特性对于 \(x,y,z\) 有类似 \(|x-y|\leq 2\) 的关系,于是乎有用的状态就很少啦,把后两维换成 \(-2\to2\),第一位加个滚动就可以愉快的 AC 了捏。

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=2023, P=998244353;
int n, lsy[N][4], ans[N];
int f[2][N][5][5];

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for(int i=1; i<=n; ++i) {
		string s; cin >> s;
		for(int j=0; j<s.size(); ++j)
			lsy[i][s[j]-'0']=1;
	}
	f[0][0][2][2]=1;
	for(int i=1; i<=n; ++i) {
		int u=i%2, v=1-u;
		memset(f[u],0,sizeof(f[u]));
		for(int j=0; j<i; ++j)
			for(int a=0; a<5; ++a)
				for(int b=0; b<5; ++b) {
					if(!f[v][j][a][b]) continue;
					int x=j, y=j+a-2, z=j+b-2, qwq;
					if(lsy[i][0]) {
						qwq=max(x,z+1);
						f[u][qwq][y-qwq+2][z-qwq+2]+=f[v][j][a][b];
						f[u][qwq][y-qwq+2][z-qwq+2]%=P;
					}
					if(lsy[i][1]) {
						qwq=max(x+1,y);
						f[u][x][qwq-x+2][z-x+2]+=f[v][j][a][b];
						f[u][x][qwq-x+2][z-x+2]%=P;
					}
					if(lsy[i][2]) {
						qwq=max(y+1,z);
						f[u][x][y-x+2][qwq-x+2]+=f[v][j][a][b];
						f[u][x][y-x+2][qwq-x+2]%=P;
					}
				} 
	}
	for(int i=0; i<=n; ++i)
		for(int a=0; a<5; ++a)
			for(int b=0; b<5; ++b) {
				ans[max(max(i,i+a-2),i+b-2)]+=f[n%2][i][a][b];
				ans[max(max(i,i+a-2),i+b-2)]%=P;
			}
	for(int i=1; i<=n; ++i)
		cout << ans[i] << ' ';
	return 0;
}

标签:int,题解,omega,吊打,leq,序列,石头,剪刀
From: https://www.cnblogs.com/chelsyqwq/p/17638852.html

相关文章

  • CF1787E The Harmonization of XOR 题解
    CF1787ETheHarmonizationofXOR题目大意给定\(n\)个数\([1,2,3,\cdots,n]\)和两个正整数\(k\)和\(x\)。将这些数分成恰好\(k\)组使得每组的异或和都是\(x\)。(\(1\lek\len\le2\cdot10^5,1\lex\le10^9\))。题解首先,我们知道,如果我们无法从\(n\)......
  • CF1787E The Harmonization of XOR 题解
    题面将集合\(\left\{1,2,\cdots,n\right\}\)划分为\(k\)个非空不交子集,使得每个子集的异或和均为\(x\)。(\(1\len,k\le2\times10^5\))。题解首先显而易见的判断一下无解的情况,记\(sum=\bigoplus\limits_{i=1}^{n}i\),如果\(k\)为奇数但\(sum\neqx\)或......
  • CF803C Maximal GCD 题解
    题意构造一个长度为\(k\),和为\(n\)的严格单调递增序列,并最大化其最大公约数。(\(1\len,k\le10^{10}\))题解首先可以发现一个事实,这个序列的最大公约数一定为\(n\)的因子。所以我们可以考虑枚举\(n\)的所有因子并判断其能否成为整个序列的最大公约数。假设我们现在枚......
  • 【题解】#373. 「USACO1.1」Friday the Thirteenth 题解(2023-07-19更新)
    #373.「USACO1.1」FridaytheThirteenth题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2背景这个蒟蒻又一次写了一篇大水题的题解(话说为什么是又),当然也是为了纪念他的\(......
  • 【题解】#68. 「NOIP2004」津津的储蓄计划 题解(2023-07-19更新)
    #68.「NOIP2004」津津的储蓄计划题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2背景这是这个蒟蒻的第一篇题解,也是这个蒟蒻对自己的\(50\)AC的纪念。Part3更新日志......
  • 算法题解之罗马数字智力游戏
    题目描述牛牛和朋友在玩耍时发现了一款关于罗马数字的智力游戏。在这个游戏中,他们首先需要将一个给定的整数num转换为对应的罗马数字。但是,他们发现,当他们每次转换后的结果字符串长度达到了一个阈值limit时,他们需要将字符串反转。请编写一个函数,将给定的整数num转换为对应的......
  • [JOISC 2014 Day3] 电压 题解
    题面给定\(n\)个点\(m\)条边的无向图。现在要对每个点黑白染色。若能够使一条边连接的两点颜色相同,其他边连接的两点颜色不同,则这条边合法。求合法的边数。$2\leqn\leq10^5,1\leqm\leq2\times10^5$。图可能不连通,不保证没有重边。题解首先考虑转化一下题目......
  • P3780 [SDOI2017] 苹果树 题解
    DescriptionP3780[SDOI2017]苹果树给定一棵\(n\)个点的树,每个点有若干个价值相同的苹果,儿子能摘至少一个仅当父亲被摘至少一个。给定\(k\),设\(h\)为你摘的苹果的最大深度,你做多能摘\(k+h\)个,求最大价值。对于所有数据,\(1\len\le5\times10^4\),\(1\lek\le5\time......
  • P4183 [USACO18JAN] Cow at Large P 题解
    题意分析我们首先想到,枚举贝茜在\(x\)点,枚举度数大于\(2\)的点为\(y\)。设\(x\)的度数为\(a\),\(y\)的度数为\(b\)。我们首先发现每个\(x\)点都有一个初始的贡献为\(a\)条通往叶子的路径。如果点\(y\)到最近的叶子节点的距离大于到\(x\)的点的距离(农夫不能在......
  • 安防监控视频汇聚平台EasyCVR视频平台调用iframe地址无法播放的问题解决方案
    安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝对接等功能。为了便于用户......