当前位置: 首页 > news >正文

P7914 [CSP-S 2021] 括号序列

题目传送门

我的博客-欢迎光临喵

曾经有位大佬说过,计数类问题不是排列组合就是 dp。可是它看着不像排列组合,所以我们考虑 dp。又注意到 \(n \le 500\),很适合 \(O(n^3)\) 的解法,所以我们考虑区间 dp。

我们发现它给了全问号的部分分,也就是没有原本字符串里字符的限制了。先考虑这一档部分分。

如果设 \(dp_{l,r}\) 表示区间 \([l,r]\) 的方案的话,似乎不太能处理括号匹配和星号个数限制。所以我们增加一维记录形态,如下:

  • \(dp_{l,r,0}\) 表示 \([l,r]\) 区间全是 * 号的方案数,形如 ** ... *。

  • \(dp_{l,r,1}\) 表示 \([l,r]\) 是一整个括号序列的方案数,形如 (...)。

  • \(dp_{l,r,2}\) 表示 \([l,r]\) 左侧是括号序列,右侧是 * 号的方案数,形如 (...)(...) ** ... * (...) ****。

  • \(dp_{l,r,3}\) 表示 \([l,r]\) 左侧是括号序列,右侧也是括号序列的方案数 (包括形态 1 ) ,形如 (...)(...) *** (...) ** ... * (...)。

  • \(dp_{l,r,4}\) 表示 \([l,r]\) 左侧是 * 号,右侧是括号序列的方案数,形如 **** (...)(...) ** ... * (...)。

  • \(dp_{l,r,5}\) 表示 \([l,r]\) 左侧右侧都是 * 号的方案数。 (包括形态 0 ) 。形如 *** (...) * (...)(...) ** ... * (...) ****。

转移方程式也很清晰了,如下:

\[\begin{cases} dp_{l,r,0}=dp_{l,r-1,0} \\ dp_{l,r,1}=dp_{l+1,r-1,0}+dp_{l+1,r-1,2}+dp_{l+1,r-1,3}+dp_{l+1,r-1,4} \\ dp_{l,r,2}=\sum\limits_{k=l}^{r-1}{dp_{l,k,3} \times dp_{k+1,r,0}} \\ dp_{l,r,3}=\sum\limits_{k=l}^{r-1}{(dp_{l,k,3}+dp_{l,k,2}) \times dp_{k+1,r,1}} + dp_{l,r,1}\\ dp_{l,r,4}=\sum\limits_{k=l}^{r-1}{(dp_{l,k,4}+dp_{l,k,5}) \times dp_{k+1,r,1}} \\ dp_{l,r,5}=\sum\limits_{k=l}^{r-1}{dp_{l,k,4} \times dp_{k+1,r,0}} + dp_{l,r,0} \\ \end{cases} \]

我们解释一下。首先,对于任何方案来说,都一定要避免把两部分星号并起来,这样无法保证个数限制。

对于形态 0 ,显然只能是 \([l,r-1]\) 之后再跟一个星号吧……所以方案数不变。

对于形态 1 ,这里卡一下定义,括号可以形如 (S)(A)(SA)(AS) ,但是不可以形如 (SAS)。(事实证明,你无法构造出来这样的合法串)。

至于为什么没有 1 形态,因为 \([l+1,r-1]\) 的 3 形态包括了 1 形态的所有情况。

对于形态 2 ,枚举末尾星号串的起点,刚才说到两部分星号不能合并,而且这是起点,所以前面部分末尾肯定是个右括号。

而 2 形态以左括号开头,所以前面也是以左括号开头的,故前半部分是 3 形态的。

5 形态的转移同 2。

至于3、4两个形态,我们枚举的是末尾的括号串的开头,而括号串不用担心星号合并的问题,故前面以星号或括号结尾皆可。

对于 3 形态,前半部分应该以左括号开头,所以前半段的形态是 2 或 3 皆可。同理 4 形态的前半段是 4 或 5 形态。

这个时候就有人要问了:那你星号串的一开始是个空串,你括号里面也可以是个空串,那你怎么处理空串的情况呢?

好问题!对于 1 ~ \(n\) 的每个 \(i\) ,我们初始化令 \(dp_{i,i-1,0}=1\),也就是把 \(i\) 位置的空串归到了 0 形态里。道理也比较简单,因为含括号的串非空。

尝试带回刚才的推导式,我们发现这么赋初值竟然不会出问题!很巧妙,对不对?

这就是 s 里面全是问号的解决方案。如果 s 里有一些字符已经确定了,我们在转移 0,1 两个形态时判断是否合法即可。

其他形态倒是不用判断,因为毕竟归根到底都是从小区间的 0,1 形态转移而来的。

代码:

P7914
#include<bits/stdc++.h>
#define int long long
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}inline void write(int x){if(x<0) putchar('-'),x=-x;if(x<10) putchar(x+'0');else write(x/10),putchar(x%10+'0');
}const int N=520;
const int mod=1e9+7;
int n,k,dp[N][N][6];
char s[N];inline bool check(int l,int r){//判断这两个位置能否填(、)两个括号 return ((s[l]=='?'||s[l]=='(')&&(s[r]=='?'||s[r]==')'));
}signed main(){//0:**...*//1:(...)//2:(...)***(...)***//3:(...)***(...)***(...)//4:***(...)***(...)//5:***(...)*(...)(...)***n=read(),k=read();scanf("%s",s+1);for(int i=1;i<=n;i++){//空串初始化 dp[i][i-1][0]=1;}for(int len=1;len<=n;len++){for(int l=1;l+len-1<=n;l++){int r=l+len-1;if(len<=k){if(s[r]=='*'||s[r]=='?'){//判断r位置能不能填 * dp[l][r][0]=dp[l][r-1][0];}}if(len>=2&&check(l,r)){dp[l][r][1]=(dp[l+1][r-1][0]+dp[l+1][r-1][2]+dp[l+1][r-1][4]+dp[l+1][r-1][3])%mod;//括号串两边不能全是* }for(int k=l;k<r;k++){dp[l][r][2]=(dp[l][r][2]+(dp[l][k][3]*dp[k+1][r][0])%mod)%mod;dp[l][r][3]=(dp[l][r][3]+(dp[l][k][2]+dp[l][k][3])%mod*dp[k+1][r][1]%mod)%mod;dp[l][r][4]=(dp[l][r][4]+(dp[l][k][4]+dp[l][k][5])%mod*dp[k+1][r][1]%mod)%mod;dp[l][r][5]=(dp[l][r][5]+(dp[l][k][4]*dp[k+1][r][0])%mod)%mod;}dp[l][r][3]=(dp[l][r][3]+dp[l][r][1])%mod;dp[l][r][5]=(dp[l][r][5]+dp[l][r][0])%mod;//最后不要忘了统计0、1形态方案数 }}int ans=dp[1][n][3];//最终合法的形态只有3 printf("%lld",ans);return 0;
}

参考资料:

1.洛谷题解

这篇题解写的很明白,我是照着他这个写的自己题解,大家有什么不理解的也可以看看这位大佬的题解OwO。

http://www.jsqmd.com/news/24428/

相关文章:

  • 破解跨地域研发协同难题:2025主流制品管理平台选型对比与关键指标解析
  • C#领域驱动设计在 ERP 项目中的应用设计
  • ansible 配置阿里源 实例
  • 借助 ChatGPT API 将 AI 集成到测试自动化框架中
  • 2025 年拉力试验机厂家最新推荐排行榜:聚焦专精特新企业技术实力与市场口碑深度解析
  • easyui gridview中toolbar中按钮的显示与否
  • 逆合成孔径雷达(ISAR)成像中的包络对齐和相位补偿算法MATLAB实现
  • 2025 年洗车机厂家最新推荐排行榜:实力企业技术服务测评及选购指南全自动 / 卷帘门 / 无接触 / 龙门式 / 隧道式 / 智能无人洗车机公司推荐
  • 251027 复现VMScape
  • 2025 年试验机厂家最新推荐排行榜:聚焦专精特新企业,全方位解析技术实力与市场口碑
  • 2025年锌铝镁桥架公司 top 10 推荐
  • 2025年锌铝镁桥架产品行业推荐与洞察
  • 2025 年德州清水混凝土修补,德州仿清水混凝土修补,德州外墙仿清水混凝土修补公司最新推荐,聚焦资质、案例、售后的五家企业深度解读
  • 2025 年德州混凝土修补,山东专业混凝土修补,山东建筑清水混凝土修补,山东装饰清水混凝土修补公司最新推荐,聚焦资质、案例、售后的五家企业深度解读
  • 高端网站设计不只是“好看”——兰亭妙微解读5个提升商业价值的设计策略
  • 前后端分离,千万别再搞错了!
  • OpenRouter vs. SightAI:统一入口,还是统一“智能体验”? - sight
  • ansible init 初始化实例
  • 详细分析Logback日志过大 - 教程
  • 写给26届文科大学应届生的秋招求职建议 - jobleap.cn助你找到满意的工作
  • 产品技术文档新范式:用PandaWiki构建智能化知识管理体系
  • 解析某省零解赛题
  • 2025 年 10 月天河区台历印刷,天河区台历印刷设计公司最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 小程序为什么越做越像App?兰亭妙微解析3个界面设计底层逻辑
  • 通用知识手册
  • 洛谷题单指南-进阶数论-CF687B Remainders Game
  • 2025 年 10 月天河区画册印刷,天河区印刷画册,天河区画册印刷设计,天河区画册印刷制作厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025 年 10 月广州画册印刷制作,广州公司画册印刷,广州宣传画册印刷,广州画册印刷设计厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 智能体来了:AI智能体就业培训的八大核心模块,开启未来职业新赛道
  • 本土化代码托管平台崛起:Gitee如何重塑国内开发者生态