题目描述

从前有个括号序列$s$,满足$|s|=m$。你需要统计括号序列对$(p,q)$的数量。
其中$(p,q)$满足$|p|+|s|+|q|=n$,且$p+s+q$是一个合法的括号序列。


输入格式

从文件$bracket.in$中读入数据。第一行两个正整数$n,m$。
第二行一个长度为$m$的括号序列,表示$s$。


输出格式

输出到文件$bracket.out$中。
输出一行一个整数,表示符合条件的$(p,q)$的数量对$10^9+7$取模的值。


样例

样例输入1:

4 1 (

样例输出1:

4

样例输入2:

4 4 (())

样例输出2:

1

样例输入3:

4 3 (((

样例输出3:

0


数据范围与提示

对于$10\%$的数据,$n\leqslant 20$;
对于$25\%$的数据,$n\leqslant 200$;
对于另外$5\%$的数据,$n=m$;
对于$55\%$的数据,$n−m\leqslant 200$;
对于$100\%$的数据,$1\leqslant m\leqslant n\leqslant 10^5,n−m\leqslant 2,000$。


题解

首先,不妨设左括号为$+1$,右括号为$-1$,那么要满足最后和为$0$,且所有前缀不小于$0$。

对于原串处理时的最小前缀如果小于$0$,则必须在原串前加左括号使之合法。

考虑$DP$,设$dp[i][j]$表示长度为$i$,总和为$j$的括号序列数量,那么$p$的方案数为$dp[i][j]$,$q$的方案数为$dp[n-m-i][j-a]$($a$为原串的总和)。

将其乘积相加即为答案。

时间复杂度:$\Theta((n-m)^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int n,m;
char ch[100001];
int res,minn;
long long dp[2001][2001],ans;
int main()
{
scanf("%d%d%s",&n,&m,ch+1);
for(int i=1;i<=m;i++)
{
if(ch[i]=='(')res++;
else res--;
minn=min(minn,res);
}
dp[0][0]=1;
for(int i=1;i<=n-m;i++)
for(int j=0;j<=i;j++)
{
dp[i][j]=dp[i-1][j+1];
if(j)dp[i][j]=(dp[i][j]+dp[i-1][j-1])%mod;
}
for(int i=0;i<=n-m;i++)
for(int j=0;j<=i;j++)
if(j+res<=n-m&&j+minn>=0)
ans=(ans+dp[i][j]*dp[n-m-i][res+j]%mod)%mod;
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:简单的序列(DP)的更多相关文章

  1. [CSP-S模拟测试]:简单的括号序列(组合数)

    题目传送门(内部题82) 输入格式 一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$. 输出格式 一行一个整数,表示满足要求的子序列数对$10^9+7$的结果. 样例 样例输入1: ...

  2. [CSP-S模拟测试]:简单的期望(DP)

    题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...

  3. [CSP-S模拟测试]:优化(贪心+DP)

    题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...

  4. NOIP模拟测试3「序列·熟练剖分·建造游乐园(play)」

    ---恢复内容开始--- 序列 刚调出来样例就A了,假装是水题. 因为是乱序,我们要求出来每两项之间最小公比,而不是直接比 求出来每两项之间最小公比,然后扫一遍就完了.(还要注意重复情况) 那么问题就 ...

  5. [CSP-S模拟测试]:w(树上DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...

  6. [CSP-S模拟测试]:赤壁情(DP)

    前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...

  7. JZOJ5804. 【2018.08.12提高A组模拟】简单的序列

    性质:每个位置的前缀和必须大于0,总和=0.以此dp即可. #include <iostream> #include <cstdio> #include <cstring ...

  8. [CSP-S模拟测试]:B(期望DP)

    题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...

  9. [CSP-S模拟测试]:密码(数位DP+库默尔定理)

    题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...

随机推荐

  1. linux 通配符与正则表达式

    linux通配符和三剑客(grep.awk.sed)正则表达式是不一样的 通配符一般用户命令行bash环境,而linux正则表达式用于awk.grep.sed

  2. [Git] 016 远程仓库篇 第三话 删除远程仓库

    1. 来到自己的 GitHub 页面,先点右上角自己的头像,再点 "Your profile" 2. 选择自己的某个远程仓库,我选 "git_skills" 3 ...

  3. golang网络编程高并发

    1 golang写服务器不需要epoll吗 golang写服务器不需要在用reactor模式的epoll了,因为golang的协程非常廉价,可以并发开启成千上完个协程. 一个协程占用内存大概2KB左右 ...

  4. Spark-Core RDD转换算子-双Value型交互

    1.union(otherDataSet) 作用:求并集. 对源 RDD 和参数 RDD 求并集后返回一个新的 RDD scala> val rdd1 = sc.parallelize(1 to ...

  5. catch that cow POJ 3278 搜索

    catch that cow POJ 3278 搜索 题意 原题链接 john想要抓到那只牛,John和牛的位置在数轴上表示为n和k,john有三种移动方式:1. 向前移动一个单位,2. 向后移动一个 ...

  6. Redis的配置与数据类型

    redis window系统的redis是微软团队根据官方的linux版本高仿的 官方原版: https://redis.io/ 中文官网:http://www.redis.cn 1. redis下载 ...

  7. shopnc如何配置微信支付和支付宝支付

    步骤一,支付宝账号申请 申请支付宝商家账号 ,填写好公司名称,资质,审核过了,然后填写下面这些参数 步骤二  微信支付申请 登陆微信公众平台-企业微信支付,得到商户号,再申请密钥 注意:支付宝加密方式 ...

  8. git合并丢失代码问题分析与解决(错误操作导致)

    问题描述 我们在主干dev和branch1分支上进行并行开发.当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了. 那么,是在branch1上,作了删除提交导致的吗 ...

  9. 使用Tensorflow搭建回归预测模型之二:数据准备与预处理

    前言: 在前一篇中,已经搭建好了Tensorflow环境,本文将介绍如何准备数据与预处理数据. 正文: 在机器学习中,数据是非常关键的一个环节,在模型训练前对数据进行准备也预处理是非常必要的. 一.数 ...

  10. ubuntu 系统问题总结

    一.主题问题 高分辨率显示可能会造成虚拟机中的显示很小,需要调整合适的显示比例.但是 ubuntu 18.04 中的 display 的 scale 只能调整 100% 300%,可能使用 gnome ...