括号序列模型及解法

>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. python初始化定长列表

    >>> lst = ['x' for n in range(5)] >>> print(lst) ['x', 'x', 'x', 'x', 'x'] >> ...

  2. Java BIO、NIO、AIO 基础,应用场景

    Java对BIO.NIO.AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必 ...

  3. Centos 6.5 版本的下载教程

    1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:https://www.centos.org/download/ 2.选择版本推荐6.5 3.选择isos 4.根据系统电脑的配置 ...

  4. redis和memcacahe、mongoDB的区别

    都是非关系型数据库,性能都非常高,但是mongoDB和memcache.redis是不同的两种类型.后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库. ...

  5. socket 多线程安全、粘包问题

    脚本如下: # -*- coding:utf-8 -*- ''' @Author: Stefan @File: server_listener.py @Date: 2016-11-09 If you ...

  6. linux内核无锁缓冲队列kfifo原理

    Linux kernel里面从来就不缺少简洁,优雅和高效的代码 比如,通过限定写入的数据不能溢出和内存屏障实现在单线程写单线程读的情况下不使用锁.因为锁是使用在共享资源可能存在冲突的情况下.还用设置b ...

  7. linux基础_使用指令2

    1.cat指令 功能:查看文件内容,是以只读的方式打开. 语法:cat [] 要查看的文件 选项: -n:显示行号 末尾加 | more:分页 使用细节: cat只能浏览文件,而不能修改文件,为了浏览 ...

  8. 【洛谷P2485】计算器

    BSGS模板题 代码如下 #include <bits/stdc++.h> using namespace std; typedef long long LL; LL fpow(LL a, ...

  9. 记一次 解决 vue 兼容ie11 的问题

    vue2.0 最近项目需要做到兼容ie11,找问题找半天,于是各种百度, 发现引入 babel-polyfill 还是有问题  空白页面 参考它的配置 ( 最后一句代码为引入的资源路径 )  我跟他差 ...

  10. 长春理工大学第十四届程序设计竞赛D Capture The Flag——哈希&&打表

    题目 链接 题意:给定一个字符串 $s$,求不同于 $s$ 的字符串 $t$,使得 $Hash(s) = Hash(t)$,其中 $\displaystyle Hash(s) = \sum_0^{le ...