括号序列模型及解法

>Codeforces314E
◦给定一个长度为n的仅包含左右括号和问号的字符串,将问号变成左括号
或右括号使得该括号序列合法,求方案总数。
◦例如(())与()()都是合法的括号序列。
◦ n<=3000。

>Solution

◦括号序列问题,往往就是把左括号看成+1,右括号看成-1,我们只需要
保证任意一个前缀大于等于0,且总和为0,就代表是个合法括号序列了。
◦令dp[i][j]表示当前到第i个字符,现在的前缀和
◦那么分三种情况考虑。
◦若第i+1个字符是左括号,则能转移到dp[i+1][j+1]。
◦若第i+1个字符是右括号,则能转移到dp[i+1][j-1]。
◦若第i+1个字符是问号,则能转移到dp[i+1][j-1]与dp[i+1][j+1]。
◦最终dp[n][0]就是方案总数啦。
◦时间复杂度为O(n^2)。

U86873 小Y的精灵国机房之旅

题解

括号序列模型唉!

所以就可以套用上面的式子啦

把Y看做左括号,H看做右括号,C看做问号

准备AC

  1. #include<iostream>
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. inline int read()
  8. {
  9. int ans=;
  10. char last=' ',ch=getchar();
  11. while(ch<''||ch>'') last=ch,ch=getchar();
  12. while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
  13. if(last=='-') ans=-ans;
  14. return ans;
  15. }
  16.  
  17. const int maxn=,mod=1e9+;
  18. int n;
  19. char a[maxn];
  20. int f[][];
  21.  
  22. int main()
  23. {
  24. n=read();
  25. scanf("%s",a+);
  26. f[][]=;
  27. for(int i=;i<=n;i++){
  28. if(a[i]=='Y'){
  29. f[i][]=;
  30. for(int j=;j<=i;j++){
  31. f[i][j]=f[i-][j-];
  32. }
  33. }
  34. if(a[i]=='H'){
  35. for(int j=;j<i;j++){
  36. f[i][j]=f[i-][j+];
  37. }
  38. f[i][i]=;
  39. }
  40. if(a[i]=='C'){
  41. for(int j=;j<i;j++){
  42. f[i][j]=(f[i-][j-]+f[i-][j+])%mod;
  43. }
  44. f[i][]=f[i-][];
  45. f[i][i]=f[i-][i-];
  46. }
  47. }
  48. printf("%d\n",f[n][]%mod);
  49. return ;
  50. }

然后发现不对劲。。。。。

二维数组一定会炸。。。。

那就。。。循环队列!

我们发现每次到新的一个 i ,它只和 i-1 有关,所以 i-1 用过一次就可以销毁了,不然也是占空间

可以像这样&1来实现循环利用

代码

  1. #include<iostream>
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. inline int read()
  8. {
  9. int ans=;
  10. char last=' ',ch=getchar();
  11. while(ch<''||ch>'') last=ch,ch=getchar();
  12. while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
  13. if(last=='-') ans=-ans;
  14. return ans;
  15. }
  16.  
  17. const int maxn=,mod=1e9+;
  18. int n;
  19. char a[maxn];
  20. int f[][maxn];
  21.  
  22. int main()
  23. {
  24. n=read();
  25. scanf("%s",a+);
  26. memset(f,,sizeof(f));
  27. f[][]=;
  28. for(int i=;i<=n;i++){
  29. if(a[i]=='Y'){
  30. f[i&][]=;
  31. for(int j=;j<=i;j++){
  32. f[i&][j]=f[(i-)&][j-];
  33. }
  34. }
  35. if(a[i]=='H'){
  36. for(int j=;j<i;j++){
  37. f[i&][j]=f[(i-)&][j+];
  38. }
  39. f[i&][i]=;
  40. }
  41. if(a[i]=='C'){
  42. f[i&][]=f[(i-)&][];
  43. for(int j=;j<i;j++){
  44. f[i&][j]=(f[(i-)&][j-]+f[(i-)&][j+])%mod;
  45. }
  46. f[i&][i]=f[(i-)&][i-];
  47. }
  48. }
  49. printf("%d\n",f[n&][]%mod);
  50. return ;
  51. }

括号序列模型--序列dp--U86873 小Y的精灵国机房之旅的更多相关文章

  1. 区间和序列上的dp

    区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...

  2. DeepLearning.ai学习笔记(五)序列模型 -- week1 循环序列模型

    一.为什么选择序列模型 序列模型可以用于很多领域,如语音识别,撰写文章等等.总之很多优点... 二.数学符号 为了后面方便说明,先将会用到的数学符号进行介绍. 以下图为例,假如我们需要定位一句话中人名 ...

  3. Coursera Deep Learning笔记 序列模型(一)循环序列模型[RNN GRU LSTM]

    参考1 参考2 参考3 1. 为什么选择序列模型 序列模型能够应用在许多领域,例如: 语音识别 音乐发生器 情感分类 DNA序列分析 机器翻译 视频动作识别 命名实体识别 这些序列模型都可以称作使用标 ...

  4. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  5. 【luoguP4006 清华集训2017】小Y和二叉树

    题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...

  6. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  7. 括号序列(区间dp)

    括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...

  8. hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  9. 牛客练习赛44 A 小y的序列 (模拟,细节)

    链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

随机推荐

  1. C++ STL 之 string

    #include <iostream> #include <string> using namespace std; // 初始化 void test01() { string ...

  2. Vue.prototype详解

    参考地址:Vue.prototype详解 如果需要设置 全局变量,在main.js中,Vue实例化的代码里添加. 不想污染全局作用域.这种情况下,你可以通过在 原型 上定义它们使其在每个Vue实例中可 ...

  3. android默认获取敏感权限

    1.通过系统签名获取权限 定制系统中,可以通过源码的签名文件对应用进行签名,在应用的AndroidManifest.xml中配置好参数,如图 <manifest xmlns:android=&q ...

  4. ASE19团队项目alpha阶段model组 scrum7 记录

    本次会议于11月11日,19时整在微软北京西二号楼sky garden召开,持续15分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...

  5. myBatis的坑 01 %的坑 框架内置的小BUG

    <select id="queryUserLikeUserName" resultType="cn.itcast.pojo.User"> selec ...

  6. Samba服务器配置案例

      一.项目背景 某公司有system.develop.productdesign和test等4个小组,个人办公机操作系统为Windows 2000/XP/2003,少数开发人员采用Linux操作系统 ...

  7. idou老师教你学Istio05: 如何用Isito实现智能路由配置

    要介绍istio请求路由,我们不由得先从pilot 和 envoy开始谈起. 在服务网格中,Pilot管理和配置所有的envoy实例.在pilot中,你几乎可以配置所有的关于流量导向规则及其他故障恢复 ...

  8. Git---Ubuntu下的安装与使用

    Git---Ubuntu下的安装与使用 注意:学会Git的唯一方式是在实际使用中学习,切记不要尝试先记住一大堆理论知识或者Git命令.

  9. windows下如何打开.sketch的文件

    1 .sketch的文件只能在苹果mac上支持的一种文件格式,现在越来越多的设计师喜欢用.sketch 2 windows下如果想打开.sketch文件,去Microsoft store 找一个Lun ...

  10. python+Appium自动化:读取Yaml配置文件

    Yaml简介 Yaml:"Yet Another Markup Language"(是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名 ...