键盘上有左括号(,右括号),和退格键-,共三个键。

牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列。

每按一次左括号(,字符串末尾追加一个左括号(

每按一次右括号),字符串末尾追加一个右括号)

每按一次退格键-,会删掉字符串的最后一个字符,

特别的,如果字符串为空,牛牛也可以按退格,但是什么都不会发生。

输出方案数对p取模,注意p可能不是质数。

注:只要按键方法不同,就是不同的方案,即使得到的序列一样。

Solution

这题和其他关于括号序列的题不太一样,因为有了删除操作。

由于我太ZZ,然后搞了个*b方程。

设dp[i][j]表示按了i次,造出了一个长度为j的序列的方案数。

转移是dp[i][j]=dp[i-1][max(0,j-1)]+dp[i-1][j+1]

这里取max是指当序列为空时我也可以退格。

然后我们就有了一个长度为j的序列,我们要把左括号和右括号往里放,使得它是一个合法的括号序列。

其实这个方案数就是卡特兰数。

于是我们枚举长度,答案加上dp[n][i]*catalan(i/2)。

然后样例爆炸。

发现(+del和)+del最后制造出的序列是一样的,但是是两种不同的方案,但按照上面的方法dp只会计算一次。

所以删除时要考虑删什么字符。

正确转移方程:dp[i][j]=dp[i-1][max(0,j-1)]+dp[i-1][j+1]*2.

Code

#include<iostream>
#include<cstdio>
#define N 1002
using namespace std;
typedef long long ll;
int n;
ll f[N][N],dp[N][N],p,ans;
int main() {
scanf("%d%lld",&n,&p);
dp[][]=;
for(int i=;i<=n;++i)
for(int j=;j<=i;++j)
dp[i][j]=(dp[i-][max(j-,)]+*dp[i-][j+])%p;
f[][]=;
for(int i=;i<=n;++i) {
f[i][]=f[i-][];
for(int j=;j<=i;++j)
f[i][j]=(f[i-][j+]+f[i-][j-])%p;
}
for(int i=;i<=n;i+=)(ans+=(f[i][]*dp[n][i])%p)%=p;
printf("%lld\n",ans);
return ;
}

合法括号序列(dp+组合数学)的更多相关文章

  1. 九度OJ 1342:寻找最长合法括号序列II (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...

  2. 九度OJ 1337:寻找最长合法括号序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...

  3. Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)

    大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...

  4. 九度oj题目1342:寻找最长合法括号序列II

    题目1342:寻找最长合法括号序列II(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:886 解决:361 题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然 ...

  5. [Jobdu] 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

  6. 九度oj 题目1342:寻找最长合法括号序列II

    题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...

  7. 九度oj 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

  8. Java 第十一届 蓝桥杯 省模拟赛 合法括号序列

    合法括号序列 题目 问题描述 由1对括号,可以组成一种合法括号序列:(). 由2对括号,可以组成两种合法括号序列:()().(()). 由4对括号组成的合法括号序列一共有多少种? 答案提交 这是一道结 ...

  9. [51nod1791] 合法括号子段 DP

    ---题面--- 题解: 首先我们需要发现一个性质,在括号序列不变的情况下,括号匹配是不会变的,因此不论子串怎么取,括号匹配的关系是不会变化的.这是一个很容易发现的性质,然而我太弱,没发现. 于是可以 ...

随机推荐

  1. node笔记

    基础入门可参考: <一起学 Node.js>—— https://github.com/nswbmw/N-blog 核心模块使用前需要引入   let fs=require('fs'); ...

  2. KafKa记录

  3. findBugs安装

    点击“Help->InstallNew Software”,如下图所示: 2 接着如下图所示: 3 Name”输入“findBugs”,“Location”输入“http://findbugs. ...

  4. [转帖]一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS

    一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS https://home.cnblogs.com/u/beyang/ 一台服务器,两个域名 首先购买https,获取到CA证 ...

  5. vue图片被加了盗链

    https://www.cnblogs.com/dongcanliang/archive/2017/04/01/6655061.html <meta name="referrer&qu ...

  6. vue bug & data type bug

    vue bug & data type bug [Vue warn]: Invalid prop: type check failed for prop "value". ...

  7. Python——Flask框架——Web表单

    一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...

  8. js 中常用的循环

    参考文章: 1.js几种数组遍历方式以及性能分析对比 2.javaScript遍历对象.数组总结 首先是数组中可以使用的 1.for 循环 for (let i = 0; i < xxx.len ...

  9. sql中的begin catch 。。。end catch 的用法

    begin catch ...end  catch 是用来处理异常的 begintry--SQLendtry begincatch--sql (处理出错动作)endcatch 我们将可能会出错的sql ...

  10. Spring Boot 构建电商基础秒杀项目 (五) 用户注册

    SpringBoot构建电商基础秒杀项目 学习笔记 UserService 添加 void register(UserModel userModel) throws BusinessException ...