首页 > 其他分享 >[BZOJ4350] 括号序列再战猪猪侠 题解

[BZOJ4350] 括号序列再战猪猪侠 题解

时间:2024-07-08 10:24:04浏览次数:20  
标签:int 题解 memset 括号 flag 猪猪 sizeof BZOJ4350 dp

我们设 \(dp_{i,j}\) 表示第 \(i\) 到第 \(j\) 个括号合并为序列且最外层不是括号 \(i\) 的可能性,\(f_{i,j}\) 表示最外层是括号 \(i\) 的可能性。则有:

\[\begin{cases} dp_{i,j}=\sum f_{i,k}(dp_{k+1,j}+f_{k+1,j})\\ f_{i,j}=dp_{i+1,j}+f_{i+1,j} \end{cases} \]

当然,并不是所有情况都能合并,所以需要维护 \(p_{i,j,k}\) 和 \(q_{i,j,k}\),表示 \(k\) 能否接在 \(i\) 到 \(j\) 的左侧/包住 \(i\) 到 \(j\)。

时间、空间复杂度均为 \(O(n^3)\)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=305,md=998244353;
int t,n,m,f[N][N],dp[N][N];
int p[N][N][N],q[N][N][N];
void solve(){
	memset(dp,0,sizeof(dp));
	memset(f,0,sizeof(f));
	memset(p,0,sizeof(p));
	memset(q,0,sizeof(q));
	cin>>n>>m;
	int flag=0;
	while(m--){
		int x,y;cin>>x>>y;
		if(x==y||flag){
			flag=1;
			continue;
		}if(x<y) q[y][y][x]=1;
		else p[x][x][y]=1;
	}if(flag){
		cout<<"0\n";
		return;
	}for(int i=1;i<=n;i++)
		f[i][i]=1;
	for(int ln=2;ln<=n;ln++)
		for(int i=1,j=ln;j<=n;i++,j++)
			for(int k=1;k<=n;k++){
				p[i][j][k]|=p[i+1][j][k]|p[i][i][k];
				q[i][j][k]|=q[i+1][j][k]|q[i][i][k];
			}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
			for(int k=1;k<=n;k++)
				p[i][j][k]+=p[i][j][k-1];
	for(int ln=2;ln<=n;ln++)
		for(int i=1,j=ln;j<=n;i++,j++){
			for(int k=i;k<j;k++){
				if(p[k+1][j][k]-p[k+1][j][i-1]) continue;
				if(p[i][k][j]-p[i][k][k]) continue;
				dp[i][j]=(dp[i][j]+(ll)f[i][k]*(dp[k+1][j]+f[k+1][j])%md)%md;
			}if(!q[i+1][j][i]) f[i][j]=(f[i+1][j]+dp[i+1][j])%md;
		}
	cout<<(dp[1][n]+f[1][n])%md<<"\n";
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--) solve();
	return 0;
} 

标签:int,题解,memset,括号,flag,猪猪,sizeof,BZOJ4350,dp
From: https://www.cnblogs.com/chang-an-22-lyh/p/18289389/bzoj4350_kuohaoxulie-zaizhan-jjbong_tj

相关文章

  • [ABC210E] Ring MST 题解
    链接洛谷相应链接atcoder相应链接题意给n(1≤n≤......
  • CodeForces CF1986C Update Queries题解
    来吧,兄弟们,再来篇题解,其实也不是题解,是我自己的思路/心得/体会UpdateQueries题面翻译题目翻译一共$t$组数据,每组数据给定长度为$n$的字符串$s$,长度为$m$的$ind$数组和字符串$c$。你可以任意安排$ind$数组和字符串$c$的顺序,并按照此顺序对字符串$s$进行$m$......
  • **CodeForces CF1928B Equalize题解**
    ok兄弟们,今天本蒟蒻来做一篇小小的题解Equalize题面翻译有一个给定的长度为$n$的数列$a$,现在加上一个排列$b$,即$c_i=a_i+b_i$。现在求对于所有可能的$b$,$c$中出现最多的数的出现次数的最大值。translateby@UniGravity.题目描述Vasyahastwohobbies—addingpe......
  • qoj8225 最小值之和 题解
    题目链接点击打开链接题目解法很牛的题啊从\(f\)序列的最小值切入,考虑把\(f_i:=f_i-f_{min}\),会对\(f'\)造成什么影响?发现会使\(f'\)中的每个数都减去\((n-1)f_{min}\),且会把原问题分成\([1,min]\)和\([min+1,r]\)这两个完全相同的子问题于是考虑区间\(dp\),令......
  • 电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决
    电脑开机检测不到硬盘,无法进入系统或者显示“RebootandSelectproperBootdevice”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。一、电脑检测不到硬盘的可能原因电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或M.2插......
  • 启动应用程序出现wevtutil.exe找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wevtutil.exe文件(挑选合适的版本文件)把它......
  • 启动应用程序出现wininit.exe找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wininit.exe文件(挑选合适的版本文件)把它放......
  • [SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解
    题目链接:CF或者洛谷PS:CF的得等上gym。前提说明其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。讲解其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里站在我的角度分......
  • [题解]细胞自动机
    给定一个长度为\(n\)的\(01\)串\(s\),用于表示一个环上的细胞的初始状态,其中第\(1\)个细胞与第\(2\)个、第\(n\)个细胞相邻;第\(n\)个细胞与第\(1\)个和第\(n-1\)个相邻。\(0\)表示细胞死亡,\(1\)表示细胞存活。接下来给定\(t\)轮操作,每一轮操作,根据上一轮细胞的状态更改此轮的状态。......
  • P9668 [ICPC2022 Jinan R] Torch 题解
    思路考虑使用矩阵模拟这个过程。首先,我们可以设初值为:\[\begin{bmatrix}0&1\end{bmatrix}\]表示瘦子初始走\(0\)米,胖子初始走\(1\)米。考虑瘦子走一步。由于瘦子每走一步都不能超过胖子,我们可以使用\((\min,+)\)矩乘来维护这个性质。那么瘦子走一步是:\[\begin{bma......