[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$的管理员密码是两个 ...
随机推荐
- Springboot2.x集成Redis集群模式
Springboot2.x集成Redis集群模式 说明 Redis集群模式是Redis高可用方案的一种实现方式,通过集群模式可以实现Redis数据多处存储,以及自动的故障转移.如果想了解更多集群模式的 ...
- [Git] 014 远程仓库篇 第一话
0. 前言 在 [Git] 001 初识 Git 与 GitHub 之新建仓库 中,我在 GitHub 上建了一个仓库 "interesting" 这回的任务 把远程的 " ...
- 关于Logcat
1 android logcat api Log.i(String tag, String msg) info,普通信息 Log.d(String tag, String msg) debug,调试信 ...
- word定义多级列表
1.单击开始选项卡里的多级列表按钮,在下拉列表中选择定义新的多级列表 2.先设置第一级编号,选择阿拉伯数字1,2,3,...,并在自动编号“1”的左右分别输入“第”“章”,级别链接到样式选择标题一 3 ...
- 不是我吹,Lambda这个坑你肯定不知道!
上周有小伙伴反馈zk连接很慢.整理出zk连接的关键逻辑如下: public class ClientZkAgent { //单例模式 private static final ClientZk ...
- nginx知识问答
1.请解释一下什么是Nginx? 答:Nginx是一个web服务器和反向代理服务器,用于HTTP.HTTPS.SMTP.POP3和IMAP协议.2.请列举Nginx的一些特性? 答:Nginx服务器的 ...
- RMQ 模板
RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为 n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大 ...
- Python RSA操作
公钥加密.私钥解密 # -*- coding: utf-8 -*- import rsa # rsa加密 def rsaEncrypt(str): # 生成公钥.私钥 (pubkey, privkey ...
- MySQL参数化有效防止SQL注入
sql语句的参数化,可以有效防止sql注入 注意:此处不同于python的字符串格式化,全部使用%s占位 from pymysql import * def main(): find_name = i ...
- modesim 仿真问题
> unisim (ERROR: Library path "d:/Xilinx/14.3/ISE_DS/ISE//vhdl/mti_se/10.1a/nt64/unisim/unis ...