[CSP-S模拟测试]:简单的序列(DP)
题目描述
从前有个括号序列$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)的更多相关文章
- [CSP-S模拟测试]:简单的括号序列(组合数)
题目传送门(内部题82) 输入格式 一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$. 输出格式 一行一个整数,表示满足要求的子序列数对$10^9+7$的结果. 样例 样例输入1: ...
- [CSP-S模拟测试]:简单的期望(DP)
题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...
- [CSP-S模拟测试]:优化(贪心+DP)
题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...
- NOIP模拟测试3「序列·熟练剖分·建造游乐园(play)」
---恢复内容开始--- 序列 刚调出来样例就A了,假装是水题. 因为是乱序,我们要求出来每两项之间最小公比,而不是直接比 求出来每两项之间最小公比,然后扫一遍就完了.(还要注意重复情况) 那么问题就 ...
- [CSP-S模拟测试]:w(树上DP)
题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...
- [CSP-S模拟测试]:赤壁情(DP)
前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...
- JZOJ5804. 【2018.08.12提高A组模拟】简单的序列
性质:每个位置的前缀和必须大于0,总和=0.以此dp即可. #include <iostream> #include <cstdio> #include <cstring ...
- [CSP-S模拟测试]:B(期望DP)
题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...
- [CSP-S模拟测试]:密码(数位DP+库默尔定理)
题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...
随机推荐
- 右键windows terminal here无法进入当前目录
很久没写水笔了,简单记一水 使用windows terminal的基本上都自己改过注册表,添加到右键windows terminal here吧,用着很方便,哪里不会点哪里. 我起初删除掉starti ...
- 获取客户机MAC地址 根据IP地址 获取机器的MAC地址 / 获取真实Ip地址
[DllImport("Iphlpapi.dll")] private static extern int SendARP(Int32 dest, Int32 host, ref ...
- abstract关键字及static关键字
抽象关键字abstract 抽象类 在类前加上关键字abstract可以将此类变成抽象类.抽象类不允许通过new关键字实例化,但是可一通过其子类向上转型为其创建实例. 抽象类可以有抽象方法,也可以没有 ...
- webpack4+vue打包简单入门
前言 最近在研究使用webpack的使用,在查阅了数篇文章后,学习了webpack的基础打包流程. 本来就可以一删了之了,但是觉得未免有点可惜,所以就有了这篇文章,供大家参考. webpack打包的教 ...
- linux查找进程id和杀死进程以及查看内存??
ps 命令用于查看当前正在运行的进程 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 -e 显示所有进程,环境变量 此参数的效果和指定"A&q ...
- 通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 使用 ref 和 out 传递数组注意事项
1.与所有的 out参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由被调用方为其赋值 示例 :在此例中,在调用方(Main 方法)中声明数组 theArray,并在 FillArra ...
- burp intruder模块详解
0×01 介绍 安装要求: Java 的V1.5 + 安装( 推荐使用最新的JRE ), 可从这里免费 http://java.sun.com/j2se/downloads.html Burp Sui ...
- mongodb连接警告修复
问题 Node.js中mongoose模块连接MongoDB数据库时提示(node:12580) DeprecationWarning: current URL string parser is de ...
- JAVA中关于日期的最常见的操作
//获取当前系统的时间戳 long times = System.currentTimeMillis(); //创建一个当前日期对象 Date now = new Date(); //基于指定的时间戳 ...