码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5184 卡特兰数

时间:2015-03-08 17:11:03      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:algorithm   组合数学   卡特兰数   

hdu 5184 卡特兰数
题意:
我们给出下列递归的合法括号序列的定义:
1. 空序列是合法括号序列
2. 如果s是一个合法括号序列,那么(s)也是合法括号序列
3. 如果a和b是合法括号序列,那么ab也是合法括号序列
4. 没有其它情况是合法括号序列

比如下列括号序列是合法括号序列
(), (()), ()(), ()(())
下列括号序列则不是
(, ), )(, ((), ((()

现在,我们要构造长度为n的合法括号序列,前面的一些括号已经给出,问可以构造出多少合法序列。
限制:
1 <= n <= 1e6
思路:
先求出剩余的左括号a个,右括号b个
然后ans=C(a+b,a)-C(a+b,a-1)

证明:
我们先看看一个卡特兰数的经典模型:

有n个1和m个-1(n>=m),共n+m个数排成一列,满足对所有0<=k<=n+m的前k个数的部分和Sk >= 0的排列数。(和问题1不同之处在于此处部分和可以为0,这也是更常见的情况) 问题等价为在一个格点阵列中,从(0,0)点走到(n,m)点且不穿过对角线x==y的方法数(可以走到x==y的点)。
把(n,m)点变换到(n+1,m)点,问题变成了问题1。
方法数为:
((n+m+1, m)) - 2*((n+m+1-1, m-1))
或:((n+m+1-1, m)) - ((n+m+1-1, m-1))

我们从后往前看,然后‘)‘就可以当作1,‘(‘可以当作-1,就可以了。


hdu 5184 卡特兰数

标签:algorithm   组合数学   卡特兰数   

原文地址:http://blog.csdn.net/whai362/article/details/44134091

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!