CSP初赛知识点讲解(十一)

卡特兰数

简单来说,就是我们已经知道了1—i-1个数出栈的可能 性想,需要我们求出i个数出栈的可能性。

假设此时第k个数已经入栈了,那么还剩下(n-k)个数, 那么剩下(n-k)个数的入出栈方案数很简单就是h[n-k],那么 已经入栈的k个数的方案数呢?h[k]?肯定不是,h[k]表示的 是前k个数出入栈种树,但是这里已经入栈的k个元素,有没 有必要先出栈,再让k+1这个元素进来,所以,明显有问题。

那我们就换一种思路,假设最后一个出栈的数是k,那么 说明[1…k-1]都在k入栈之前出栈了,然后k再入栈,接下来 再是[k+1…n入栈],然后[k+1…n]出栈。那么此时k都把前 后两部分隔离成了独立的两部分,在k入栈之前,前面部分 已经入栈并且出栈了。在k之后的部分,后面部分比k后入栈 并且先入栈。所以,公式就出来了:

h [ n ] = h [ 0 ] × h [ n − 1 ] + h [ 1 ] × h [ n − 2 ] + … + h [ n − 1 ] × h [ 0 ] h[n]=h[0]\times h[n-1]+h[1]\times h[n-2]+…+h[n-1]\times h[0] h[n]=h[0]×h[n1]+h[1]×h[n2]++h[n1]×h[0]

还有一种证明方法,也很简单: 设 h [ i ] [ j ] h[i][j] h[i][j]表示栈内有i个,出栈的有j个的方案数。要达 到当前这种状态,他的前一状态只有两种可能,入栈一个或 者出栈一个,如果是入栈要到达 h [ i ] [ j ] h[i][j] h[i][j],那么上一状态就是 h [ i − 1 ] [ j ] h[i-1][j] h[i1][j],如果是出栈到达 h [ i ] [ j ] h[i][j] h[i][j],那么就是 h [ i + 1 ] [ j 1 ] h[i+1][j 1] h[i+1][j1].那么递推公式就有了: h [ i ] [ j ] = h [ i − 1 ] [ j ] + h [ i + 1 ] [ j − 1 ] h[i][j]=h[i-1][j]+h[i+1][j-1] h[i][j]=h[i1][j]+h[i+1][j1]. 注意一下,只有j是递增的,可能后用到后面的值,所以 先枚举 j j j,在枚举 i i i。就可以得到正确答案。 但是前面两种时间复杂度都是 O ( n 2 ) O(n^2) O(n2)的,能不能更快一 点,直接找公式而不是递推公式。

公式也是可以推导的。画一个图就很好理解了。

在平面直角坐标系中,x轴表示入栈次数,y轴表示出栈 次数,那么卡特兰数就可以表示为从(0,0)点到达(n,n)点不 越过直线y=x的方案数。

如果不考虑限制,总方案数为 C n 2 n C^{2n}_n Cn2n,那么限制呢?我们会发现对于所有不满足条件的情况,一定是在若干次操作 之出栈比入栈多一次,即这个点在y=x+1上,我们发现如果 把后面部分都相对于这条线对称,那么最后一定要到达点 (n-1,n+1).即任何非法路径都可以变成(0,0)到(n-1.n+1)的 一条无限制的情况,那么合法方案为:

C n 2 n − C n − 1 2 n C^{2n}_n-C^{2n}_{n-1} Cn2nCn12n

也可以转换成 1 ( n + 1 ) ∗ C n 2 n {1 \over(n+1)}*C^{2n}_n (n+1)1Cn2n还有 h [ i + 1 ] = 4 n + 2 n + 2 × h [ i ] h[i+1]=\frac{4n+2}{n+2}\times h[i] h[i+1]=n+24n+2×h[i]

适用范围

根据前面的推导过程,我们很容易想到卡特兰数的适用范围:

(1)一种情况的数量一直>=另一种情况

(2)最终两种情况的数量一定相等

只要满足这两种条件,那么他就是卡特兰数

下面我给出一点例子:

(1)给出一个n,要求一个长度为2n的01序列,使得序列的任意前缀中的1的个数不少于0的个数

(2)从(0,0)到达(n,n)点,每次只能向上或者向右,问不越过y=x的方案数

(3)有2n个人进入剧场,入场费5元,售货员自己没零钱有n个人有5元的钞票,剩下n个人只有10元钞票,问有多少种方法可以使得所有人都可以正常入场。

(4)n个左括号,n个右括号,问合法括号排列的方案数

卡特兰数与树

一共有2n+1个结点,问所有不同构的含有(n+1)个叶子结点的二叉树的个数(区分左右儿子)。

对于一个满二叉树而言,叶子结点个数=非叶子结点数+1但是实际上,也有不是满二叉树就满足条件。只要满足子树要么为空,要么满都可以满足条件。设叶子结点为x,非叶子结点为y;如果子树都满或者空,x=y+1,如果不满足,x<y+1并且只有当插入到只有一个儿子结点的位置,叶子结点才会+1.所以一定是满或空这种形态。

那么我们思考一下,最开始只有一个结点,就是叶子结点,然后再添加一个结点,此时x=y,那么为了满足x=y+1,又的让叶子结点+1。一直这样循环。当最后满足有n个叶子结点,n个非叶子结点的时候,最后再添加的那一个结点是固定的,所以实际上还是卡特兰数。

只是:h[i]表示有n+1个叶子结点的二叉树的个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值