首页 > 其他分享 >ABC 312D题 Count Bracket Sequences

ABC 312D题 Count Bracket Sequences

时间:2024-06-01 11:22:37浏览次数:20  
标签:Count ABC int 替换成 Bracket 字符串 卡特兰 dp

题意

  • 给定一个非空的字符串,其由(,),?三个字符构成,其中?可以被(或者)给替换掉,求替换后的字符串是符合括号匹配的情况下的方案数。最后答案对mod=998244353取模

思路

  1. 应该算是一个板题,一开始的想法是往卡特兰数的方向思考,但是可能是我太水了没想出来,然后一想到卡特兰数的dp求法,就顺理成章的想到了dp。
  2. 我们将(替换成1,)替换成-1,对于一个合法的括号匹配来说,对于任何一项i,我们都有前缀和为正数,否则就不合法了。我们定义dp[i][j]为到达字符串的第i位,前缀和为j的情况下的方案数,那么我们就可以很容易得出状态转移方程:
  • dp[i][j]=dp[i-1][j-1],(a[i]==1)
  • dp[i][j]=dp[i-1][j+1]+dp[i-1][j-1],(a[i]==0)
  • dp[i][j]=dp[i-1][j+1],(a[i]==-1)
  1. 注意一下字符串的开头,当j==0时,防止数组越界,我们单独处理一下。当然注意取模,先取模后相加。

代码

string s;
cin>>s;
int n=s.length();
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
	if(s[i-1]=='(') a[i]=1;
	else if(s[i-1]==')') a[i]=-1;
	else a[i]=0;
}
for(int i=1;i<=n;i++)
{
	for(int j=0;j<=i;j++)
	{
		if(a[i]==1) dp[i][j]=dp[i-1][j-1]%mod;
		else if(a[i]==0)
		{
		    if(i==1&&j==0) dp[i][j]=0;
		    else dp[i][j]=(dp[i-1][j+1]%mod+dp[i-1][j-1]%mod)%mod;
		}
		else dp[i][j]=dp[i-1][j+1]%mod;
	}
}
cout<<dp[n][0]%mod<<endl;
return 0;

}

标签:Count,ABC,int,替换成,Bracket,字符串,卡特兰,dp
From: https://www.cnblogs.com/lulu7/p/18225718

相关文章

  • Atcoder ABC355 C~F
    C出题人太善良了,加强到\(10^5\)都没问题。考虑维护每条横线竖线两条对角线上被标记的点的个数,每次标记点后,判断是否有线上点全被标记。再考虑如何将点编号转为坐标,记编号为\(t\),推柿子:\[(x-1)\timesn+y=t\]\[nx+y=t+n\]\[x=\frac{t+n-y}{n}\]等同于找到\(y\)使得:\[n......
  • D. Invertible Bracket Sequences
    D.InvertibleBracketSequencesAregularbracketsequenceisabracketsequencethatcanbetransformedintoacorrectarithmeticexpressionbyinsertingcharacters'1'and'+'betweentheoriginalcharactersofthesequence.Forexam......
  • ABC 354
    B-AtCoderJanken2本来想开\(\rmvector<pair<string,int>>\)的,但发现其实没有必要,整数部分只需求和即可。另外,多个字符串按字典序升序排序可以直接存\(\rmvector\)后\(\rmsort\)。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmai......
  • QOJ 4824 Bracket-and-bar Sequences
    考虑到这个实际上没有特别好的表示方法。不如从\(n\le25\),猜想合法的序列数量不多。考虑对这个计数。类似于合法括号序计数,考虑把串拆为\(\texttt{(}\cdots\texttt{|}\cdots\texttt{)}\cdots\)来考虑。那么令\(f_i\)表示\(i\)对\(\texttt{(|)}\)组成的序列的数量。......
  • 「杂题乱刷」 AT_abc285_e
    好题。直接上代码吧。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?打cf不要用umap!!!记住,rating是身外之物。该冲正解时冲正解!Problem:算法:思路:*/#include<bits/stdc++.h>usingnamespacest......
  • TabControl和TabItem的样式自定义:为什么要使用自定义模板?
    在WPF(WindowsPresentationFoundation)中,控件的外观和行为是通过控件模板(ControlTemplate)来定义的。TabControl和TabItem控件也不例外,它们的默认控件模板定义了这些控件的结构和视觉状态。在实际应用中,开发者可能会发现直接设置TabItem的某些属性(例如Background)时不会生效。这篇......
  • 实现Avalonia平台下低配版的Dock控件:实现TabControl的可关闭
    在弄一个项目,在WPF下用Dock控件,在Avalonia平台下实现也有一个Dock控件,但用起来有点复杂。Install-PackageDock.AvaloniaInstall-PackageDock.Model.Mvvm感兴趣的可以访问网站了解:https://github.com/wieslawsoltes/Dock其实本身用的比较简单,所以就想着,用TabControl来改一下......
  • ABC355
    E将所有的下标作为点,建一张无向图。当且仅当可以询问\([l,r]\)时,在点\(l\)和\(r+1\)之间连一条边。可以发现能求出\([L,R]\)的和等价于\(L\)与\(R+1\)连通,且最少询问次数等于两点间最短路径边数。具体实现是容易的。F边权很小,提示我们可以暴力枚举和替换边。开......
  • abc 355 F - MST Query
    题目链接:https://atcoder.jp/contests/abc355/tasks/abc355_f题目要求动态维护最小生成树.那么我们考虑朴素的Kruskal算法:将边从小到大排序,不断加边,用并查集维护联通块,加边加到整张图联通(联通块数量为1)为止,最后的答案就是从小到大遍历边权将边的数量*当前边权相加起来......
  • ABC 305D Sleep Log
    题意现在给你一个高桥君的睡眠表a,若i为奇数,那么高桥君在a[i]~a[i+1]这段时间没有睡觉,反之则处于睡眠期间。现在有q次询问,每次询问会给出l,r,分别表示起始时间和终止时间,求这段时间内高桥君的睡眠时间思路我们可以将每个[l,r]拆成若干个整块的睡眠时间或未睡眠时期加上零碎的......