简要题意

给定 \(k\),定义 “超级括号序列”(简称括号序列,下同) 字符串为:

  • 仅由 ( ) * 三种字符组成。
  • 下面令 \(S\) 为不超过 \(k\) 个 \(\ast\) 字符拼接而成的字符串(\(S\) 可以为空字符串)。
  • \(\text{(S)}\) 是括号序列。
  • 如果 \(A\) 是括号序列,\(\text{(AS)},\text{(SA)}\) 都是括号序列。
  • 如果 \(A,B\) 是括号序列,则 \(\text{ASB}\) 是括号序列。
  • 特别的,空字符串不是括号序列。

例如,若 \(k = 3\),则字符串 \(\text{((**()*(*))*)(***)}\) 是括号序列,但字符串 \(\text{*()}\)、\(\text{(*()*)}\)、\(\text{((**))*)}\)、\(\text{(****(*))}\) 均不是。

给你一个长度为 \(n\) 的括号序列 \(s\),有的字符已经确定,有的字符尚未确定(用 \(\text{?}\) 替代)。求该字符串将所有尚未确定的字符一一确定的方法,使得得到的字符串是一个括号序列?对 \(10^{9}+7\) 取模。

对于 \(100 \%\) 的数据,\(1 \le k \le n \le 500\)。

思路

非常神仙的区间 DP 题。

状态设计

先设状态:

  • \(f[l][r][0]\) 为 \([l,r]\) 为 \(S\) 型字符串的个数。如 ********
  • \(f[l][r][1]\) 为 \([l,r]\) 为被匹配的括号包裹的字符串个数。如 (*(*(*))*)
  • \(f[l][r][2]\) 为 \([l,r]\) 为以括号序列开头,\(\ast\) 结尾的字符串个数。如 (*(*)*)***(*)*
  • \(f[l][r][3]\) 为 \([l,r]\) 为以括号序列开头与结尾的字符串个数,包含 \(f[l][r][2]\)。
  • \(f[l][r][4]\) 为 \([l,r]\) 为以括号序列结尾,\(\ast\) 开头的字符串个数,如 ****(*(***))
  • \(f[l][r][5]\) 为 \([l,r]\) 为以 \(\ast\) 开头或结尾的个数,包含 \(f[l][r][0]\)。

状态转移

\[f[l][r][0]=\left\{
\begin{aligned}
& f[l][r-1][0] & \operatorname{ast}(r)\\
& 0 & \text{otherwise}
\end{aligned}
\right.
\]

解释:\(\operatorname{ast}(r)\) 指 \(s_r\) 可能为 \(\ast\)。如果不是 \(\ast\) 自然没有了。

\[f[l][r][1]=\left\{
\begin{aligned}
& (f[l+1][r-1][0]+f[l+1][r-1][2]+f[l+1][r-1][3]+f[l+1][r-1][4])& \operatorname{match(l,r)} \\
& 0 & \text{otherwise}
\end{aligned}
\right.
\]

解释:\(\operatorname{match}(l,r)\) 为 \(s_l,s_r\) 可能括号匹配。加括号的时候,除了两边都是 \(\ast\) 且中间有括号序列外,其他都可以。

\[\begin{aligned}
&f[l][r][2]=\sum_{i=l}^{r-1}f[l][i][3]\cdot f[i+1][r][0] \\
&f[l][r][3]=(\sum_{i=l}^{r}(f[i+1][r]\cdot (f[l][i][2]+f[l][i][3]))+f[l][r][1]) \\
&f[l][r][4]=\sum_{i=l}^{r}f[i+1][r][1]\cdot (f[l][i][4]+f[l][i][5]) \\
&f[l][r][5]=(\sum_{i=l}^{r}f[l][i][4]\cdot f[i+1][r][0])+f[l][r][0]
\end{aligned}
\]
  • \(f[l][r][2]\) 中是括号序列开头(3)接 \(\ast\)(0)
  • \(f[l][r][3]\) 可以是 2,3 开头,必须是 0 结尾
  • \(f[l][r][4]\) 可以是4,5 开头,必须是 1 结尾
  • \(f[l][r][5]\) 可以是4 开头,0 结尾。

最后答案就是 \(f[1][n][3]\)。

时间复杂度 \(O(n^3)\)。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int f[505][505][10];
char s[505];
int n,k;
const int MOD = 1e9+7; inline bool is_star(int pos){
return (s[pos]=='*'||s[pos]=='?');
}
inline bool is_left_bracket(int pos){
return (s[pos]=='('||s[pos]=='?');
}
inline bool is_right_bracket(int pos){
return (s[pos]==')'||s[pos]=='?');
}
inline bool is_brackets_matched(int left,int right){
return is_left_bracket(left)&&is_right_bracket(right);
}
int m(int x){return (x%MOD+MOD)%MOD;}
void M(int &x){x=m(x);} signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
cin>>(s+1);
for(int i=1;i<=n;i++){
f[i][i-1][0]=1;
}
for(int length=1;length<=n;length++){
for(int l=1,r=length;l<=n&&r<=n;l++,r++){
// 处理情况 0
if(length<=k && f[l][r-1][0] && is_star(r))f[l][r][0]=1;
else f[l][r][0]=0;
// 处理情况 1
if(length>1 && is_brackets_matched(l,r)){
f[l][r][1]=m(f[l+1][r-1][0]+f[l+1][r-1][2]+f[l+1][r-1][3]+f[l+1][r-1][4]);
}
// 处理情况 2
if(length>1){
for(int i=l;i<r;i++){
f[l][r][2] += m(f[l][i][3]*f[i+1][r][0]);
M(f[l][r][2]);
}
}
// 处理情况 3
if(length>1){
for(int i=l;i<r;i++){
f[l][r][3] += m(m(f[l][i][2]+f[l][i][3])*f[i+1][r][1]);
M(f[l][r][3]);
}
}
f[l][r][3] += f[l][r][1];M(f[l][r][3]);
// 处理情况 4
if(length>1){
for(int i=l;i<r;i++){
f[l][r][4] += m(m(f[l][i][4]+f[l][i][5])*f[i+1][r][1]);
M(f[l][r][4]);
}
}
// 处理情况 5
if(length>1){
for(int i=l;i<r;i++){
f[l][r][5] += m(f[l][i][4]*f[i+1][r][0]);
M(f[l][r][5]);
}
}
f[l][r][5]+=f[l][r][0];M(f[l][r][5]);
}
}
cout<<m(f[1][n][3]);
return 0;
}

P7914 [CSP-S 2021] 括号序列的更多相关文章

  1. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  2. BZOJ4350: 括号序列再战猪猪侠

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...

  3. DP专题——括号序列

    毕竟是个渣,写完一遍之后又按LRJ的写了一遍,再写了一遍递归版,最终加上输出解部分 括号序列 定义如下规则序列(字符串): 空序列是规则序列: 如果S是规则序列,那么(S)和[S]也是规则序列: 如果 ...

  4. 【BZOJ】2209: [Jsoi2011]括号序列(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题 ...

  5. 51nod1476 括号序列的最小代价

    这题应该可以用费用流写吧?不过我想不出贪心来TAT.其实还是单调队列乱搞啊T_T //ÍøÉϵÄ̰ÐÄËã·¨ºÃÉñ°¡¡£¡£¡£ÎÒÖ»»áÓÃ×îС·ÑÓÃ×î´óÁ÷ÅÜTAT #in ...

  6. lintcode: 有效的括号序列

    题目: 有效的括号序列 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and']', 判定是否是有效的括号序列. 样例 括号必须依照 "() ...

  7. uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

    #31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...

  8. bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...

  9. CODEVS 3657 括号序列

    [问题描述] 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例 ...

随机推荐

  1. Request method ‘POST‘ not supported。 Failed to load resource: net::ERR_FAILED

    1.问题描述 技术栈:前后端项目分离(Springboot+Vue+MybatisPlus) 前端报错信息: 后端报错信息: 2.问题分析 这里使用了ResultFul风格的接口设计方式.增删改查对应 ...

  2. servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)

    文章目录 1.什么是过滤器? 2.过滤器核心对象 3.过滤器创建和配置 4.举例子 1.什么是过滤器? 主要用于对客户端的请求进行过滤处理,再将经过过滤后的请求转交给下一个资源. 2.过滤器核心对象 ...

  3. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

  4. Linux执行jsp命令的时候报错:-bash: jps: command not found

    前言:在zookeeper学习的时候,执行jsp命令查看zookpper运行状态的时候发现报错: -bash: jps: command not found 翻阅了一大批文章,不是东拼西凑,就是缺斤少 ...

  5. NLP之基于TextCNN的文本情感分类

    TextCNN @ 目录 TextCNN 1.理论 1.1 基础概念 最大汇聚(池化)层: 1.2 textCNN模型结构 2.实验 2.1 实验步骤 2.2 算法模型 1.理论 1.1 基础概念 在 ...

  6. 1.-Django项目结构

    一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.   Django基本组件: 1.基本配置文件/路由系统 2. ...

  7. 解决头部使用 position:fixed; 固定定位后遮住下方内容的问题

    1.在头部下面给一个空的 div 给这个div设置高度,把页面撑开,这种方法是让头部刚好遮住的是这个空div,把内容放出来. 但是这种方法需要一点点调试高度,所以不推荐. 2.把整个要使用 posit ...

  8. kubeedge架构与核心设计---https://bbs.huaweicloud.com/webinar/100009

    今天是kubeedge的第一节课,今天主要带大家回顾一下云原生和边缘计算的发展历程 然后我们会重点介绍一下kubeedge这个项目,他的设计背景和核心理念与我们整体的架构 首先是我们来简单回归一下云原 ...

  9. 【DL论文精读笔记】VGGNet

    VGGNet(Very Deep Convolutional Networks) 1.introduction ● 采用3x3的小卷积核应用在比较深的网络里 ● 结果不错,赢得了2014 Imagen ...

  10. vulnhub靶场之EVILBOX: ONE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:EVILBOX: ONE,下载地址:https://download.vulnhub.com/evilbox/EvilBox---One.ova ...