\(\\\)

\(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;
}

转载于:https://www.cnblogs.com/SGCollin/p/9664687.html

[ Nowcoder Contest 165 #D ] 合法括号序列相关推荐

  1. 【字符串2】(删除公共字符、合法括号序列判断、两种排序方法、密码强度等级)

    字符串题集 1. 删除公共字符 题目描述 题目分析 C++代码 2. 合法括号序列判断 题目描述 题目分析 C++代码 3. 两种排序方法 题目描述 题目分析 C++代码 4. 密码强度等级 题目描述 ...

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

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

  3. 编程题——合法括号序列

    编程题--合法括号序列 题目描述: 对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串. 给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串. 示例1: 输入 ( ...

  4. 牛客网--关于合法括号序列判断

    牛客网--关于合法括号序列判断 题目描述 代码 题目描述 对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串. 给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串 ...

  5. 刷题日记【第四篇】-笔试必刷题【Fibonacci数列+合法括号序列判断+两种排序方法+求最小公倍数】

    目录 选择题模块 1. 以下对继承的描述错误的是(A) 2. 在Java中,一个类(B) 3. 以下不是Object 类的方法的是(D) 4. Test.main() 函数执行后的输出是(D) 编程题 ...

  6. 最长合法括号子序列(括号序列+贪心)

    1.题目引入: 一个合法的括号序列满足以下条件: 序列()被认为是合法的. 如果序列X与Y是合法的,则XY也被认为是合法的. 如果序列X是合法的,则(X)也是合法的. 例如,(),()(),(())这 ...

  7. 2016百度实习编程题:括号序列

    不知如何解决 1.感觉贪心或者动态规划,不知道如何解决 2.做过生成合法括号序列的题目,想到用DFS补成合法的括号,然而没有成功

  8. BZOJ4350: 括号序列再战猪猪侠

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...

  9. 2020\Simulation_2\4.括号序列

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

最新文章

  1. 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
  2. infor wms 项目启动_全一,企业物流定制专家——企业客户项目管理流程解析
  3. Faster R-CNN改进篇(二): RFCN ● RON
  4. 杜比收购低延迟流媒体平台Millicast
  5. http --- HTTPS是在安全的传输层上发送的HTTP
  6. 每日一题(52)—— 进程
  7. 可控硅失效现象_闩锁现象及其防护
  8. 【Java数据结构】链式存储的二叉树
  9. TabActivity,LocalActivityManager,TabHost,TabWidget深度分析(一)
  10. python实现取出一个列表或者多个列表中的公共前缀
  11. 计算机控制系统信号的采样,计算机控制系统-信号采样与分析演示.ppt
  12. 蓝桥杯 人民币金额大写 格式转换
  13. epoch - iteration - batch
  14. 【教学类-06】20220119 VS python 20以内加减法(不重复)
  15. 产品运营常踩的七大坑,你踩过吗?
  16. Shader的合并同类项
  17. Cesium双屏对比
  18. 密室逃脱3天蓝色房间
  19. 如何使用Leaflet加载QGIS切图工具生成的瓦片
  20. shell设置输出信息的颜色

热门文章

  1. putty ubuntu服务器 上传文件,教你如何使用PuTTY上传文件?
  2. openwrt 系统日志配置_Openwrt 之 Samba配置
  3. 脑电植入:治疗抑郁症的新方法?重磅!UCSF研究人员成功治疗一例重度抑郁症患者...
  4. Python-EEG工具库MNE中文教程(14)-Epoch对象中的元数据(metadata)
  5. html5网页仿写,纯CSS代码模仿绘制蚂蚁庄园页面
  6. 百度4年前干翻自己,打通Waymo特斯拉路线二脉,赢得全球竞速先机
  7. 刚刚,马斯克再次创造航天历史!SpaceX首次载人发射任务成功
  8. 为了故意刁难AI,科学家们制造了这1200个问题,超强AI被“打回原形”
  9. 【347天】跃迁之路——程序员高效学习方法论探索系列(实验阶段105-2018.01.18)...
  10. javascript 内部函数的定义及调用