组合数学之卡特兰数

经典问题:

给定一个长度为n的序列,将这组序列入栈,问有多少种合法的出栈顺序。

分析问题:栈只能在一端操作,出栈的前提是栈中一定有数字,如果忽略这个前提,那么一共有C(2n,n)种走法,即:出栈入栈操作一共有2n次,总共要入栈n次,出栈n次。但这其中有非法的解,比如我先出栈n次再入栈n次,这种肯定是不合法的。

我们将这个问题几何化,构建数学模型:

我们起始点位于(0,0)  目标点是(2n,0)  有两种走法:一种向右上走一步,即从(i,j)->(i+1,j+1)  另一种向左下走一步,即(i,j)->(i+1,j-1)

要求不能越过x轴,问共有多少种合法的走法。

如图所示:我们接上一个问题继续,要处理非法的解的数量,发现非法的解肯定穿过x轴,必然的,非法的解一定穿过y=-1  

我们对非法解的图像从与y=-1相交的点开始作关于y=-1的对称,发现对称后的图像最终一定收束于(2n,-2)

也就是说,非法的解等效于(0,0)-> (2n,-2) 即非法的解总共向右上走了n-1步,向右下走了n+1步, 共有C(2n,n-1)种走法

得出结论: 卡特兰数 h(n)=C(2n,n)-C(2n,n-1)

这类问题都可以等效抽象成出栈入栈的模型,还有类似的经典问题:

一个n*n的矩形,从左上走到右下,只能向下或者向右,不能越过主对角线https://vjudge.net/problem/51Nod-1120

p较小,n比较大,Lucas+卡特兰数 最后记得*2

猜你喜欢

转载自blog.csdn.net/neuq_zsmj/article/details/81583863
今日推荐