考虑在一个确定的括号序列中,我们可以枚举中间位置,按左右最长延伸出去的答案计算。

我们很自然的思考,我们直接维护左右两边,在删除一些字符后能够延伸的最长长度。

我们设\(f_{i,j}\)为\(i\)点合法删除向左延伸的最大长度。

\(
f_{i,j} =
\left\{
\begin{aligned}
&f_{i - 1,j} (a[i] = ')'\ )\\
&f_{i - 1,j - 1}(a[i] = ')'\ )\\
&f_{i - 1,j} + f_{i - 1 ,j - 1} (a[i] = '?'\ )\\
\end{aligned}
\right.
\)

设\(g_{i,j}\)为向右延伸,则有同样的转移。

\(ans = \sum_{i = 1}^n\sum_{j = 1}^j f_{i,j} * g_{i + 1,j} * j\)

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define N 2005
#define mod 998244353 char a[N]; ll n;
ll f[N][N],g[N][N]; int main(){
scanf("%s",a + 1);
n = strlen(a + 1);
f[0][0] = 1;
for(int i = 1;i <= n;++i){
if(a[i] == '(' || a[i] == '?')
for(int j = 1;j <= n;++j)
f[i][j] = (f[i][j] + f[i - 1][j - 1]) % mod;
if(a[i] == ')' || a[i] == '?')
for(int j = 0;j <= n;++j)
f[i][j] = (f[i][j] + f[i - 1][j]) % mod;
}
g[n + 1][0] = 1;
for(int i = n;i >= 1;--i){
if(a[i] == ')' || a[i] == '?')
for(int j = 1;j <= n;++j)
g[i][j] = (g[i][j] + g[i + 1][j - 1]) % mod;
if(a[i] == '(' || a[i] == '?')
for(int j = 0;j <= n;++j)
g[i][j] = (g[i][j] + g[i + 1][j]) % mod;
}
ll ans = 0;
for(int i = 1;i <= n - 1;++i)
for(int j = 1;j <= n;++j)
ans = (ans + f[i][j] * g[i + 1][j] % mod * j % mod) % mod;
std::cout<<ans<<std::endl;
}

CF1264D1 Beautiful Bracket Sequence (easy version)的更多相关文章

  1. CF1264D2 Beautiful Bracket Sequence (hard version)

    考虑\(D1\)的\(O(n^2)\),我们直接进行组合处理. 考虑在\(p\)这个位置,左边有\(l\)个(,右边有\(r\)个),左边有\(l\)个问号,右边有\(r\)个问号. 这个位置的贡献为 ...

  2. Numerical Sequence (easy version)

    http://codeforces.com/problemset/problem/1216/E1 E1. Numerical Sequence (easy version) time limit pe ...

  3. CF1264D2 Beautiful Bracket Sequence

    我们枚举每两个字符的空档,统计一个空档左边有 \(l\) 个左括号, 右边有 \(r\) 个右括号,左边有 \(u\) 个问号,右边有 \(v\) 个问号. 则对于 \(p\) 的答案 \(ans_p ...

  4. Codeforces 1264D - Beautiful Bracket Sequence(组合数学)

    Codeforces 题面传送门 & 洛谷题面传送门 首先对于这样的题目,我们应先考虑如何计算一个括号序列 \(s\) 的权值.一件非常显然的事情是,在深度最深的.是原括号序列的子序列的括号序 ...

  5. Ping-Pong (Easy Version)(DFS)

    B. Ping-Pong (Easy Version) time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. CF1225B1 TV Subscriptions (Easy Version)

    CF1225B1 TV Subscriptions (Easy Version) 洛谷评测传送门 题目描述 The only difference between easy and hard vers ...

  7. UESTC 1546 Bracket Sequence

                                        Bracket Sequence Time Limit: 3000MS   Memory Limit: 65536KB   64 ...

  8. CF#138 div 1 A. Bracket Sequence

    [#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...

  9. CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)

    E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...

随机推荐

  1. 禅道开源版 Ldap认证插件开发

    禅道开源版-Ldap插件开发 背景 由于开源版无法使用ldap认证,所以在此分享一下自己开发禅道的ldap开发过程,希望对你有所帮助. 简单说一下这个插件的功能: 1.跳过原有禅道认证,使用ldap认 ...

  2. 你知道什么是JUC了吗?

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  3. 【二食堂】Alpha - Scrum Meeting 5

    Scrum Meeting 5 例会时间:4.15 12:30 - 13:00 进度情况 组员 昨日进度 今日任务 李健 1. 主页搭建结束issue2. 与后端协商确定接口的设计3. 查找文本区域功 ...

  4. 2020年OO助教工作总结

    随着这学期课程的落幕,我一学期的OO助教工作也宣告结束.这学期我的工作主要在系统组,和OO后台的数据库打交道. 作业查重 我几乎每周都会做的例行工作,是对每周的homework进行查重管理.由于使用了 ...

  5. 2021.10.11考试总结[NOIP模拟74]

    T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...

  6. 单片机入门stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...

  7. Netty:Reactor Pattern 与 Dubbo 底层传输中的 NettyServer

    首先,我们需要了解Reactor模式的三种线程模型: 1)单线程模型 Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下: 作为 NIO 服务 ...

  8. NOIP模拟86(多校19)

    T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...

  9. 关于linux的fork的一点学习总结

    最近操作系统的实验要用到fork,于是去搜索了一下资料,很幸运地在博客中找到一篇深度好文: http://blog.csdn.net/jason314/article/details/5640969 ...

  10. Spring事务不生效问题

    事务未生效可能造成严重的数据不一致性问题,因而保证事务生效至关重要.Spring事务是通过Spring aop实现的,所以不生效的本质问题是spring aop没生效,或者说没有代理成功,所以有必要了 ...