卡特兰数
卡特兰数相关应用
关于以下各种简略证明的详细证明见左神视频。
进出栈模型
即:\(1,2,...,n\) 按顺序入栈,可随意出栈,求不同的出栈序列数量。
可以利用公式 1 来证明。
将入栈操作对应左括号,出栈操作对应右括号。那么一个合法过程会唯一对应某个 RBS。
不考虑满足 RBS 的性质,\(n\) 个左括号和 \(n\) 个右括号的不同排列方案数为 \(C_{2n}^{n}\);设不满足 RBS 性质的括号串数量为 \(cnt\),则答案为 \(C_{2n}^{n} - cnt\)。
考虑如何计算 \(cnt\):我们考虑证明每一个不满足 RBS 性质的括号串,会一一映射到包含 \(n-1\) 个左括号,\(n+1\) 个右括号的括号串。而后者的数量是 \(C_{2n}^{n-1}\),因此 \(cnt = C_{2n}^{n-1}\)。
进而我们能得到另一个实用的结论:长度为 \(2n\) 的合法括号串(RBS)数量就是 \(n\) 的卡特兰数。
关于第 3 个问题的简略证明:显然编号奇偶性相同的点不能连接,否则一定无解;那么我们将所有编号为奇数(\(1,3,...,2n-1\))的点按顺序入栈,可随意弹出栈,并与当前未参与连接的最小偶数编号的点连接。这样的方案数与所有合法的方案数一一对应。
路径计数模型
平面直角坐标系中,从 \((0,0)\) 到 \((n, n)\),每一步只能向上或向右走一步,可以碰对角线(这里对应上图的虚斜线)但不能走入左上半区,合法路径的方案数。
利用公式 1。
利用进出栈模型大致也可以 get 到答案。这里我们给出比较权威的简略证明:
不考虑左上半区的限制,只考虑从 \((0,0)\) 到 \((n, n)\) 的方案数,显然就是向上 \(n\) 步与向右 \(n\) 步的排列组合方案数,为 \(C_{2n}^{n}\),即总方案数。那么我们就只需要求出违规的路径数有多少条就可以了。
结论:从 \((0, 0)\) 到 \((n, n)\) 违规的路径数(即走到过图中的实斜线某一处),可以一一映射从 \((-1, 1)\) 到 \((n, n)\) 的所有路径数量。
只需要将最后一次经过实斜线之前的路径按照实斜线作翻转就能看出一一映射关系了。由于从 \((-1, 1)\) 到 \((n, n)\) 的所有路径必然经过实斜线,因此也会对应着所有违规的路径。
而从 \((-1, 1)\) 到 \((n, n)\) 的路径数显然为 \(C_{2n}^{n-1}\),因此合法的路径数为 \(C_{2n}^{n} - C_{2n}^{n-1}\)。
拓展:从 \((0,0)\) 到 \((n, n)\),每一步只能向上或向右走一步,不能碰对角线(不算 \((0, 0)\) 和 \((n, n)\)),合法路径的方案数:\(2(C_{2n-2}^{n-1} - C_{2n-2}^{n})\)。具体证明见视频。
划分左右相乘模型
将 \(n+2\) 条边的凸多边形通过顶点连线,划分成若干三角形,且连续不能相交,划分方案数。
利用公式 4。
划分完成后,多边形的每条边一定隶属于某个三角形中。我们固定某一条边作为三角形底边,然后枚举其他点作为三角形顶点,构成一个 底边是多边形边 的三角形。该三角形的另外两条边便将该多边形分成了两个子多边形,可以看作子问题递归求解。设 \(n+2\) 条边的凸多边形答案为 \(f(n)\),则:
另一个经典问题:一共 \(n\) 个结点,认为结点之间无差别,能形成多少种结构不同的二叉树?
固定某个点为根节点,剩下的 \(n-1\) 个结点作为左右子树部分,枚举左子树有 \(i\) 个结点,可形成 \(f(i)\) 种不同结构;右子树有 \(n-1-i\) 个结点,可形成 \(f(n - 1 - i)\) 种不同结构,\(i \in [0, n - 1]\),因此可得到上式。





浙公网安备 33010602011771号