【数学】组合数学 - 卡特兰数
父级页面:【数学】组合数学
卡特兰数
记号为 \(H_n\) 第n个卡特兰数,下面的n就是指这个。
\(H_0=1, H_1=1, H_2=2, H_3=5, H_4=14, H_5=42\)
卡特兰数最常见的场景是合法的括号序,还有栈进出的方案。他们的特点就是“右括号”、“出栈”的次数不能超过剩余的“左括号”、“入栈”的次数。这个可以用一个叫做反射法的方法统计。
圆上2n个点,用n条线段,每个点连1条线段,然后一共有多少种方法。连接的两个点,左端点认为是入栈,右端点是出栈,所以对应到上面的问题。
n+2个顶点的凸多边形的三角剖分。这个还是用O(n)递推公式去理解好了。固定(1,2)这条边为底,它属于哪个三角形?三角形的顶点有n+1种选法。确定这个顶点之后会递归给两侧的小多边形。也就是
其中 \(H_0 = 1\)
这个公式用“向上或向右走格点的方案”也挺好证明的。枚举这条路径上除了路径端点外,第一次到达y=x的点,设其横坐标为i,显然其纵坐标也为i。由于是“第一次到达”,所以套用下文的“i步向上和i步向右的除端点外不接触y=x的方案数”,也就是 \(H_{i-1}\),在i之后,不再需要不接触y=x,只需要不穿过y=x,所以后续的n-i步对应 \(H_{n-i}\) ,所以:
n个相同的节点组成的二叉树。遍历当前节点的时候入栈,在进入右子树的之前要先把当前节点及其之前的弹出,唯一对应这个栈。也可以用dp去理解,dp[i]表示i个节点能组成的不同的二叉树,很显然去掉当前节点,枚举左子树的节点数,得到 \(dp[n]=dp[0]*dp[n-1]+dp[1]*dp[n-2]+\cdots+dp[n-1][0]\) 为卡特兰数的 O(n)递推式。
可以说,如果不考虑非法的方案,如果有n个左括号和n个右括号,显然方案是 \(C_{2n}^n\) ,那么非法的方案呢?
如果以左括号为纵坐标+1,右括号为横坐标+1,上面的合法方案相当于是整条线都在y=x直线以上。考虑非法的方案,一定有第一个横坐标+1跨过了y=x的线,考虑在这个第一个越过y=x的点之后,一定到达的是y=x-1的线,把后续的整条线按y=x-1翻转(相当于是左右一一对应互换,所以计数一样),翻转之后的终点在(n+1, n-1),所以方案数是 \(C_{2n}^{n-1} = C_{2n}^{n+1}\)。
所以合法的方案数 \(H_n = C_{2n}^{n} - C_{2n}^{n-1}\)
展开这个式子
同理
与这个方法类似的计数方式就是“向上或者向右的格点路径计数”,“不越过某条线”这个条件就等价于第一次越过这条线之后的每一步都沿着这条线的最近的平行线做一个对称,可以解决诸如“所有元素都是+1和-1(数量不一定相等)”,比如n个+1和m个-1,求有多少种排列方式使其前缀和最低时不低于k(k<=0)。就是把第一次触碰到k-1之后的+1和-1全部符号变成相反数。如果不进行这个操作的话最后和为n-m,方法数为C(n+m,n)。其实就是把终点(n,m)按某条表示限制前缀和的直线对称,得到的点就是结果。
除端点外不接触y=x的n步向上和n步向右的路径数:易知第一步一定是向上,最后一步一定是向右,然后变成从(0,1)到(n-1,n),不穿过直线y=x+1的路径数,即 \(H_{n-1}\)