[ Nowcoder Contest 165 #D ] 合法括号序列
\(\\\)
\(Description\)
键盘上有三个键,敲击效果分别是:
- 在输出序列尾部添加一个左括号
- 在输出序列尾部添加一个右括号
- 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生
求恰好按键\(N\)次,输出序列是一个合法的括号序列的方案数对\(P\)取模的值。
只要按键顺序或内容有一个位置不同就视为不同。
- \(N\in [1,10^3]\),\(P\in [1,10^4]\),不保证\(P\)为质数。
\(\\\)
\(Solution\)
神仙出题人神仙解法......
首先有一个结论,对于一个长度确定的序列,其输出的方案数是确定的,且与具体每一个位置的内容无关。
为什么呢?因为每一个位置输出是确定的,所以最后操作序列只需要改成符合要求的即可。
于是我们先考虑求出输出一个长度为\(i\)的序列的方案数,设\(f[i][j]\)表示一共按键\(i\)次,当前输出序列长度为\(k\)的方案数。转移就很自然,考虑是新加上一个还是删掉一个末尾的。因为序列确定,如果新加上的是输出序列,那么新加上的方案是唯一的,而删除就不需要确定末尾是什么了。注意退格键在输出序列为空时也可使用,有转移方程:
\[f[i][j]=(f[i-1][max(0,j-1)]+f[i-1][j+1]\times 2)\%mod
\]然后就是考虑长度为\(i\)的合法序列方案数了,这不是\(Catalan\)吗!一个非质数打你脸上分解质因数太麻烦了,然后出题神仙就给出了神仙\(DP\)做法。设\(g[i][j]\)为当前输出序列长度为\(i\),强制所有右括号合法,有\(j\)个左括号不合法的方案数。那么就有自然简单易懂直接的转移方程:
\[g[i][j]=(g[i-1][j+1]+(j>0?g[i-1][j-1]:0))\%mod
\]代表新放一个右括号抵消掉一个左括号或新放一个左括号。
\[ans=\sum_{i=0}^{\lfloor\frac N 2\rfloor} f[n][i\times2]\times g[i\times 2][0]
\]
\(\\\)
\(Code\)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define R register
#define N 1010
using namespace std;
int n,mod,ans,f[N][N],g[N][N];
int main(){
scanf("%d%d",&n,&mod);
f[0][0]=1;
for(R int i=1;i<=n;++i)
for(R int j=0;j<=i;++j)
f[i][j]=(f[i-1][j+1]+(j!=0?f[i-1][j-1]:0))%mod;
g[0][0]=1;
for(R int i=1;i<=n;++i)
for(R int j=0;j<=i;++j)
g[i][j]=(g[i-1][max(0,j-1)]+(g[i-1][j+1]<<1))%mod;
for(R int i=0;i<=(n>>1);++i) (ans+=g[n][i<<1]*f[i<<1][0])%=mod;
printf("%d\n",ans);
return 0;
}
[ Nowcoder Contest 165 #D ] 合法括号序列的更多相关文章
- 九度oj题目1342:寻找最长合法括号序列II
题目1342:寻找最长合法括号序列II(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:886 解决:361 题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然 ...
- [Jobdu] 题目1337:寻找最长合法括号序列
题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...
- 九度OJ 1342:寻找最长合法括号序列II (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...
- 九度OJ 1337:寻找最长合法括号序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...
- 九度oj 题目1342:寻找最长合法括号序列II
题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...
- 九度oj 题目1337:寻找最长合法括号序列
题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...
- Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
合法括号序列 题目 问题描述 由1对括号,可以组成一种合法括号序列:(). 由2对括号,可以组成两种合法括号序列:()().(()). 由4对括号组成的合法括号序列一共有多少种? 答案提交 这是一道结 ...
- 合法括号序列(dp+组合数学)
键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...
- [牛客网NOIP赛前集训营-普及组(第二场)]D-合法括号序列
链接:https://www.nowcoder.com/acm/contest/165/D来源:牛客网 合法括号序列 键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字 ...
随机推荐
- 【03】json使用
[03]json使用 把 JSON 文本转换为 JavaScript 对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 J ...
- Leetcode 90.子集
子集 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...
- codevs3410 别墅房间
题目描述 Description 小浣熊松松到他的朋友家别墅去玩,发现他朋友的家非常大,而且布局很奇怪.具体来说,朋友家的别墅可以被看做一个N*M的矩形,有墙壁的地方被标记为’#’,其他地方被标记为’ ...
- UVA_1575
https://vjudge.net/problem/UVA-1575 枚举答案(k)..对k质因数分解,质数的指数为cnt[i],若n==A(tot_cnt,tot_cnt) / A(cnt[i]& ...
- Java使用JNative调用DLL库
编写测试DLL文件,源文件参照JNA调用用的DLL文件.地址:http://www.cnblogs.com/vevy/p/9076941.html (很重要)右键项目 --> 属性 --> ...
- - > 网络流(草地排水)
网络流(Dinic(模板)) Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 《Linux内核分析》MOOC课程
http://www.cnblogs.com/wickedpriest/p/4315189.html
- unary operator expected
在centos系统从root用户切换到oracle用的时候,总是提示 : -bash- : :[: unary operator expected 能切换成功,就是总提示上面这个, 后来找到原因,在安 ...
- JS实现转动随机数抽奖的特效代码
JS实现转动随机数抽奖的特效代码 大家都玩过抽奖游戏,或者梦想抽到大奖吧.可是有没有想过抽奖游戏是怎么实现的呐?今天就给大家分享一款转动随机数抽奖的JS特效代码. 实现代码例如以下 <!Doct ...
- 两种Linux下非交互式命令的实现
一.概述 在Linux环境,有多种实现自己主动化的脚本语言.如Shell.Python.Perl.Tcl等. Shell语言因与Shell外壳结合紧密,是最常见的实现自己主动化的脚本语言. 同一时候, ...