括号序列模型及解法

>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

#include<iostream>
#include<bits/stdc++.h>
using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=,mod=1e9+;
int n;
char a[maxn];
int f[][]; int main()
{
n=read();
scanf("%s",a+);
f[][]=;
for(int i=;i<=n;i++){
if(a[i]=='Y'){
f[i][]=;
for(int j=;j<=i;j++){
f[i][j]=f[i-][j-];
}
}
if(a[i]=='H'){
for(int j=;j<i;j++){
f[i][j]=f[i-][j+];
}
f[i][i]=;
}
if(a[i]=='C'){
for(int j=;j<i;j++){
f[i][j]=(f[i-][j-]+f[i-][j+])%mod;
}
f[i][]=f[i-][];
f[i][i]=f[i-][i-];
}
}
printf("%d\n",f[n][]%mod);
return ;
}

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

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

那就。。。循环队列!

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

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

代码

#include<iostream>
#include<bits/stdc++.h>
using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=,mod=1e9+;
int n;
char a[maxn];
int f[][maxn]; int main()
{
n=read();
scanf("%s",a+);
memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=n;i++){
if(a[i]=='Y'){
f[i&][]=;
for(int j=;j<=i;j++){
f[i&][j]=f[(i-)&][j-];
}
}
if(a[i]=='H'){
for(int j=;j<i;j++){
f[i&][j]=f[(i-)&][j+];
}
f[i&][i]=;
}
if(a[i]=='C'){
f[i&][]=f[(i-)&][];
for(int j=;j<i;j++){
f[i&][j]=(f[(i-)&][j-]+f[(i-)&][j+])%mod;
}
f[i&][i]=f[(i-)&][i-];
}
}
printf("%d\n",f[n&][]%mod);
return ;
}

括号序列模型--序列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. win10环境安装配置Nginx

    前言: 参考 https://blog.csdn.net/kisscatforever/article/details/73129270 Nginx的应用场景      1. http服务器.Ngin ...

  2. Centos7.7安装swoole

    系统版本:centos 7.7(查看系统版本:cat /etc/redhat-release) 执行命令安装swoole: yum update -y && yum remove ph ...

  3. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  4. 我理解的epoll(一)——实现分析

    epoll项目中用了几次,但是对于其原理只是一知半解.我希望通过几篇blog能加深对她的理解. 我认为epoll是同步IO,因为他在调用epoll_wait时,内核在有I/O就绪前是阻塞的,虽然可以将 ...

  5. day_02比特币的转账机制及其7个名词

    一:比特币的转账机制: 类似于普通转账:登录钱包--->选择转出(入)币的钱包地址--->填入转出数额及其手续费--->比特币签名--->提交比特币网络--->进行矿工打 ...

  6. win10快速设置环境变量

    同时按WIN+R键,打开“运行”对话框,输入sysdm.cpl,按回车键打开“系统属性”. 在系统属性对话框中选择“高级”选项卡.

  7. Mariadb多实例启动脚本

    #!/bin/bash port=3306 mysql_user="root" mysql_pwd="centos" cmd_path="/app/m ...

  8. bind支持mysql

    最近打算将bind的记录信息存入到数据库中去,网上找了下,原来早有老外写好了mysql-bind的补丁,重新编译bind即可实现bind支持mysql存储.(http://mysql-bind.sou ...

  9. mybatis sql语句中转义字符

    问题: 在mapper  ***.xml中的sql语句中,不能直接用大于号.小于号要用转义字符 解决方法:   1.转义字符串 小于号    <    < 大于号    >    & ...

  10. python mysql插入中文乱码

    # "INSERT INTO" 语句sql = "INSERT INTO sites (name, url, status, enable) VALUES (%s, %s ...