题目描述

给出一个只包含左括号和右括号的字符串,插入若干左右括号(可以插在任意位置)之后使得字符串长度为$ 2\times n $ 且是一个合法的括号序列。求最后能组成多少种不同的合法括号序列。

【合法的括号序列:该序列任意一个前缀的左括号数大于等于右括号数,最终左括号数等于右括号数】

输入

输入文件名为regular.in。

第一行一个数 \(n\)

第二行一个字符串(长度小于等于 $ 2\times n $ )

输出

输出文件名为regular.out。

输出一个数,表示答案 $ \pmod {10^9 + 7} $

样例输入

2
()

样例输出

2

提示

【数据说明】

对于50%的数据,$ 1 \le n \le 10 $

对于100%的数据,$ 1 \le n \le 100 $

这个题...从学术角度来看,不失为一道好题,但是从我个人感情角度来看,就是道破题,为什么?——题目具有迷惑性...导致我考虑错误的思路半天.....我一开始错误的思路就是把一共能有多少对括号算出来

然后用Catlan数求解,不过这个思路为什么错了,我还不是很清楚...

说说正解的思路吧——DP:

这里采用了三维, $ dp_{ i , j , k } $ 表示插入 $ i $ 个括号,使用了原来的 $ j $ 个括号,现在左括号比右括号多 $ k $ 个的方案数

看起来挺麻烦的是吧....确实挺麻烦,一共有四个状态转移方程——使用原序列的左括号,插入一个左括号,使用原序列的右括号,插入一个右括号,这分别是四个方程的意义

我们考虑,枚举三维状态进行转移

当我们当前有一个左括号时,我们就要采用前两种转移,枚举到一个位置并且不是末位的时候,我们当然可以选择使用一个原序列的左括号或者再插入一个左括号,显然这样一定合法

同理,当我们有一个右括号时,我们应该采用后两种转移,枚举到一个位置并且不是末位的时候,我们当然也可以选择使用一个原序列的右括号或者再插入一个右括号,显然这样也是合法的.

最后的答案自然是在 $ dp_{ i \times 2 - m , m , 0} $ 中了

代码如下:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define LL long long const LL mod = 1e9 + 7 ; LL dp[220][220][220],n,m;
char s[10000]; int main(){
scanf ("%lld" , & n );
scanf ("%s" , s );
dp[0][0][0] = 1 ; m = strlen ( s ) ;
register LL maxf = ( n << 1 ) - m ;
for(int i = 0 ; i <= maxf ; ++ i)
for (int j = 0 ; j <= m ; ++ j)
for (int k = 0 ; k <= n ; ++ k){
if ( s[j] == '(' && j < m )
dp[ i ][ j + 1 ][ k + 1 ] = ( dp [ i ][ j ][ k ] + dp[ i ][ j + 1 ][ k + 1 ] ) % mod ;
else dp[ i + 1 ][ j ][ k + 1 ] = ( dp [ i ][ j ][ k ] + dp[ i + 1 ][ j ][ k + 1 ] ) % mod ;
if ( k ){
if ( s[j] == ')' && j < m )
dp[ i ][ j + 1 ][ k - 1 ] = ( dp [ i ][ j ][ k ] + dp[ i ][ j + 1 ][ k - 1 ] ) % mod ;
else dp[ i + 1 ][ j ][ k - 1 ] = ( dp [ i ][ j ][ k ] + dp[ i + 1 ][ j ][ k - 1 ] ) % mod ;
}
}
printf ("%lld\n" , dp[maxf][m][0] % mod );
return 0;
}

清北-Day6-regular的更多相关文章

  1. 清北Day4

    版权声明:如需转载请标明出处,未得到本人许可请勿转载. 今天就可以看到传说中的 数据结构 嘿嘿嘿嘿 都有什么呢 链表 队列 栈 st表 hash 线段树 树链剖分 一.栈: 放出来这个看烂了的图 值得 ...

  2. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  3. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  4. 清北Day 2

    清北第二天,感受到了来自这个世界的不友善,大概把没听过不会的"名词"记录下来就已经一面了,然后被大佬说这都是最基础的东西,就很皮,那就趁别人练习字符串的题的时候,来写波博客了,倒不 ...

  5. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  6. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  7. 清北省选 DAY last 集锦

    这是题目描述的链接: http://lifecraft-mc.com/wp-content/uploads/2018/03/problems1.pdf (虽然这次没去清北,但还是厚颜无耻的做了一下这套 ...

  8. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  9. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

  10. 清北学堂模拟day6 兔子

    [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...

随机推荐

  1. XSS原理及防范

    Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意html标签或者javascript代码.比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取cook ...

  2. Luogu5289 十二省联考2019皮配(动态规划)

    将选择导师看成先选阵营再选派系,这样有显然的O(nm2)暴力,即按城市排序后,设f[i][j][k]为前i个学校中第一个阵营有j人第一个派系有k人的方案数,暴力背包. 对于k=0,可以发现选阵营和选派 ...

  3. PHP——模糊匹配文件|目录

    内置函数 glob函数 详解 http://www.w3school.com.cn/php/func_filesystem_glob.asp

  4. 【LOJ2586】【APIO2018】选圆圈 CDQ分治 扫描线 平衡树

    题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1,c_2,\ldots,c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \ ...

  5. XUGUO-书呆子-搜索书箱

    WorldCat 上的 米塔斯 通过图书馆馆藏的全球目录WorldCat,在附近的图书馆中查找所要的资料. < 用 Sketch 创作 Airiti Library華藝線上圖書館 BookBub ...

  6. tomcat在windows及linux环境下安装

    下载tomcat 下载地址: https://tomcat.apache.org/download-90.cgi 7,8,9的版本都可以下,这里下载最新版本 注意:Binary是编译好的,可以直接使用 ...

  7. JS学习笔记Day13

    一.cookie (一)什么是cookie: 1.就是会话跟踪技术,存放在客户端浏览器中的一段文本信息 2.会话:从浏览网站开始到结束的这个过程称为一次会话,浏览器关闭,表示会话结束 3.会话跟踪技术 ...

  8. MyBatis小问题(1)-Mapper中错误No constructor found...

    前两天又被公司叫去修改其他产品的一些问题了,没有看java相关的,今天周六,看了看MyBatis东西. 就是简单的在MySql中建了个users表,很简单,包含id,name,age,写了个bean. ...

  9. js的7种类型

    众所周知,js有7种数据类型 1.  null 2. undefined 3. boolean 4. number 5. string 6. 引用类型(object.array.function) 7 ...

  10. 缓存服务—Redis

    Redis 简介Redis 是一个开源(BSD 许可)的.内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 为什么要用 Redis 在高并发场景下,如果需要经常连接结果变动频繁的数据库, ...