括号序列模型--序列dp--U86873 小Y的精灵国机房之旅
括号序列模型及解法
>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的精灵国机房之旅的更多相关文章
- 区间和序列上的dp
区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...
- DeepLearning.ai学习笔记(五)序列模型 -- week1 循环序列模型
一.为什么选择序列模型 序列模型可以用于很多领域,如语音识别,撰写文章等等.总之很多优点... 二.数学符号 为了后面方便说明,先将会用到的数学符号进行介绍. 以下图为例,假如我们需要定位一句话中人名 ...
- Coursera Deep Learning笔记 序列模型(一)循环序列模型[RNN GRU LSTM]
参考1 参考2 参考3 1. 为什么选择序列模型 序列模型能够应用在许多领域,例如: 语音识别 音乐发生器 情感分类 DNA序列分析 机器翻译 视频动作识别 命名实体识别 这些序列模型都可以称作使用标 ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- 【luoguP4006 清华集训2017】小Y和二叉树
题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- 括号序列(区间dp)
括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- 牛客练习赛44 A 小y的序列 (模拟,细节)
链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...
随机推荐
- C++ STL 之 string
#include <iostream> #include <string> using namespace std; // 初始化 void test01() { string ...
- Vue.prototype详解
参考地址:Vue.prototype详解 如果需要设置 全局变量,在main.js中,Vue实例化的代码里添加. 不想污染全局作用域.这种情况下,你可以通过在 原型 上定义它们使其在每个Vue实例中可 ...
- android默认获取敏感权限
1.通过系统签名获取权限 定制系统中,可以通过源码的签名文件对应用进行签名,在应用的AndroidManifest.xml中配置好参数,如图 <manifest xmlns:android=&q ...
- ASE19团队项目alpha阶段model组 scrum7 记录
本次会议于11月11日,19时整在微软北京西二号楼sky garden召开,持续15分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...
- myBatis的坑 01 %的坑 框架内置的小BUG
<select id="queryUserLikeUserName" resultType="cn.itcast.pojo.User"> selec ...
- Samba服务器配置案例
一.项目背景 某公司有system.develop.productdesign和test等4个小组,个人办公机操作系统为Windows 2000/XP/2003,少数开发人员采用Linux操作系统 ...
- idou老师教你学Istio05: 如何用Isito实现智能路由配置
要介绍istio请求路由,我们不由得先从pilot 和 envoy开始谈起. 在服务网格中,Pilot管理和配置所有的envoy实例.在pilot中,你几乎可以配置所有的关于流量导向规则及其他故障恢复 ...
- Git---Ubuntu下的安装与使用
Git---Ubuntu下的安装与使用 注意:学会Git的唯一方式是在实际使用中学习,切记不要尝试先记住一大堆理论知识或者Git命令.
- windows下如何打开.sketch的文件
1 .sketch的文件只能在苹果mac上支持的一种文件格式,现在越来越多的设计师喜欢用.sketch 2 windows下如果想打开.sketch文件,去Microsoft store 找一个Lun ...
- python+Appium自动化:读取Yaml配置文件
Yaml简介 Yaml:"Yet Another Markup Language"(是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名 ...