我的课程:组合数学 矩阵(c++)
卡特兰数
初始条件:C0=1C0=1
递推式1:
Cn=∑i=0n−1Ci⋅Cn−i−1Cn=i=0∑n−1Ci⋅Cn−i−1
含义:将规模为 nn 的问题拆分为两个独立子问题,左子问题规模 ii,右子问题规模 n−1−in−1−i,通过乘法原理计算单种拆分的方案数,求和得到总方案数。
递推式2:
Cn=2(2n−1)n+1⋅Cn−1Cn=n+12(2n−1)⋅Cn−1
通项:
Cn=1n+1(2nn)=(2nn)−(2nn−1)Cn=n+11(n2n)=(n2n)−(n−12n)
参考资料:https://www.cnblogs.com/willeywindsor/p/19733310
卡特兰数(Catalan Number)全面详解与典型例题
卡特兰数是组合数学中用于解决带约束的计数问题的经典数列,核心描述「两类对等元素的排列中,任意前缀满足某类元素数量不小于另一类」的场景,广泛应用于括号匹配、栈操作、二叉树计数、路径规划等领域。
目录
- 卡特兰数核心定义与公式 1.1 基本定义与前几项 1.2 核心递推公式 (1)二阶求和递推式(本质分治思想) (2)一阶线性递推式(编程计算首选) 1.3 通项公式 (1)闭合式(最常用,直接计算) (2)容斥式(反射原理推导,体现核心本质) 1.4 生成函数与渐近特性
- 底层原理:反射原理与核心判据 2.1 基础模型:Dyck路径 2.2 反射原理推导通项 2.3 卡特兰数问题核心判据
- 经典应用场景
- 典型例题详解 (一)基础例题:直接套用核心模型 例题1 括号匹配计数 例题2 栈的出栈序列判断 例题3 凸多边形三角划分 (二)进阶例题:模型转化与边界处理 例题4 买票找零进阶版 例题5 不相交握手问题 例题6 选票问题(广义卡特兰数) (三)编程实战例题(力扣真题) 例题7 力扣96. 不同的二叉搜索树 例题8 力扣22. 括号生成
- 易错点与注意事项
1 卡特兰数核心定义与公式
1.1 基本定义与前几项
卡特兰数下标从0开始,初始条件 C0=1C0=1 第 nn 个卡特兰数记为 CnCn。
前11项(C0C0 ~ C10C10):1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796
直观感受:C3=5C3=5、C4=14C4=14 是最常用的基础值,C20C20 已达百亿级,呈指数级增长。
1.2 核心递推公式
(1)二阶求和递推式(本质分治思想)
初始条件:C0=1C0=1 对 n≥1n≥1,有:
Cn=∑i=0n−1Ci⋅Cn−1−iCn=i=0∑n−1Ci⋅Cn−1−i
含义:将规模为 nn 的问题拆分为两个独立子问题,左子问题规模 ii,右子问题规模 n−1−in−1−i,通过乘法原理计算单种拆分的方案数,求和得到总方案数。
(2)一阶线性递推式(编程计算首选)
初始条件:C0=1C0=1 对 n≥1n≥1,有:
Cn=2(2n−1)n+1⋅Cn−1Cn=n+12(2n−1)⋅Cn−1
优势:无需循环求和,单步递推即可计算,时间复杂度 O(n)O(n),适合大数取模场景,由通项公式直接化简得到。
1.3 通项公式
(1)闭合式(最常用,直接计算)
Cn=1n+1(2nn)Cn=n+11(n2n)
其中 (2nn)(n2n) 为组合数,表示从 2n2n 个元素中选 nn 个的方案数。
(2)容斥式(反射原理推导,体现核心本质)
Cn=(2nn)−(2nn−1)Cn=(n2n)−(n−12n)
含义:总方案数 - 非法方案数 = 合法方案数,是所有卡特兰数问题的底层逻辑。
1.4 生成函数与渐近特性
普通生成函数:
G(x)=∑n=0∞Cnxn=1−1−4x2xG(x)=n=0∑∞Cnxn=2x1−1−4x
渐近增长式(n→∞n→∞):
Cn∼4nn3/2πCn∼n3/2π4n
说明卡特兰数呈指数级增长,计算时需注意数值溢出。
2 底层原理:反射原理与核心判据
卡特兰数的所有应用,本质都是Dyck路径模型的映射,通过反射原理完成严谨推导。
2.1 基础模型:Dyck路径
定义:从原点 (0,0)(0,0) 出发,到终点 (n,n)(n,n),每步仅能向右 R(1,0)R(1,0) 或向上 U(0,1)U(0,1),且路径全程不越过直线 y=xy=x(即任意点 (x,y)(x,y) 满足 y≤xy≤x)。
合法Dyck路径的总数,就是第 nn 个卡特兰数 CnCn。
2.2 反射原理推导通项
总路径数:从 (0,0)(0,0) 到 (n,n)(n,n) 共需 2n2n 步,其中 nn 步 RR、nn 步 UU,总方案数为 (2nn)(n2n)。
非法路径数:路径越过 y=xy=x(即触碰直线 y=x+1y=x+1)的方案数。 对任意非法路径,找到其第一次触碰 y=x+1y=x+1 的点,将起点到该点的路径关于 y=x+1y=x+1 镜像反射,起点 (0,0)(0,0) 会被反射到 (−1,1)(−1,1)。
该反射是双射:每条非法路径唯一对应一条从 (−1,1)(−1,1) 到 (n,n)(n,n) 的路径,反之亦然。 从 (−1,1)(−1,1) 到 (n,n)(n,n) 共需 2n2n 步,其中 n+1n+1 步 RR、n−1n−1 步 UU,方案数为 (2nn−1)(n−12n)。
合法路径数:总路径数 - 非法路径数 = (2nn)−(2nn−1)(n2n)−(n−12n),化简后即闭合式 1n+1(2nn)n+11(n2n)。
2.3 卡特兰数问题核心判据
一个问题可通过卡特兰数计数,当且仅当满足以下3个条件:
- 可抽象为两类对等的操作/元素(记为A、B),总数量均为 nn;
- 排列/操作过程中,任意前缀中A的数量 ≥ B的数量;
- 最终A、B的总数量完全相等。
3 经典应用场景
所有场景均严格匹配核心判据,只需完成元素与约束的映射即可套用卡特兰数:
| 应用场景 | 元素映射(A/B) | 核心约束 | 方案数 |
|---|---|---|---|
| n对括号合法匹配 | 左括号/右括号 | 任意前缀左括号数 ≥ 右括号数 | CnCn |
| n个元素合法出栈序列 | 入栈操作/出栈操作 | 任意前缀入栈次数 ≥ 出栈次数 | |
| n个节点的不同二叉树 | 左子树节点/右子树节点 | 根节点拆分后,左右子树独立计数 | |
| 凸n+2边形三角划分 | 拆分后的左右凸多边形 | 三角形拆分后无重叠、无遗漏 | |
| 圆周2n个点不相交弦 | 弦分割的左右点集 | 所有弦两两不相交,点不重复连接 | |
| 2n人买票找零(5元/10元各n人) | 持5元者/持10元者 | 任意前缀5元人数 ≥ 10元人数 | |
| (0,0)到(2n,0)非降路径(步长±1) | +1步/-1步 | 路径全程不越过x轴(y≥0) |
4 典型例题详解
分基础入门、进阶转化、编程实战三个层级,覆盖从概念理解到落地应用的全场景。
(一)基础例题:直接套用核心模型
例题1 括号匹配计数
题目:求n=4时,合法的括号匹配序列有多少种?验证结果的正确性。
思路:直接匹配卡特兰数经典模型,n对括号的合法匹配数为 CnCn。
解答: 闭合式计算:
C4=14+1(84)=15×70=14C4=4+11(48)=51×70=14
递推验证:
C4=C0C3+C1C2+C2C1+C3C0=1×5+1×2+2×1+5×1=14C4=C0C3+C1C2+C2C1+C3C0=1×5+1×2+2×1+5×1=14
结果一致。
合法性校验:所有序列满足「任意前缀左括号数≥右括号数,总左=右=4」,符合核心判据。
核心考点:卡特兰数基础模型识别,公式直接应用。
例题2 栈的出栈序列判断
题目:元素1、2、3、4按顺序入栈,请问有多少种合法出栈序列?判断序列 3,2,4,1 和 4,1,2,3 是否合法。
思路:合法出栈序列数对应卡特兰数 C4C4;序列合法性的核心是「任意时刻出栈次数不超过入栈次数」。
解答: 合法序列总数:n=4,对应 C4=14C4=14 种。 序列 3,2,4,1:操作过程为「1入、2入、3入、3出、2出、4入、4出、1出」,全程栈非空时出栈,合法。 序列 4,1,2,3:要先出4,必须1、2、3、4全部入栈,栈顶为4,出栈后栈顶只能是3,无法出1,非法。
核心考点:栈操作与卡特兰数的映射关系,非法序列的本质识别。
例题3 凸多边形三角划分
题目:凸六边形有多少种不同的三角划分方案?
思路:凸 mm 边形的三角划分方案数对应卡特兰数 Cm−2Cm−2(m=n+2 ⟹ n=m−2m=n+2⟹n=m−2)。
解答: 凸六边形 m=6m=6,对应 n=6−2=4n=6−2=4,方案数为 C4=14C4=14。
核心考点:几何问题的组合转化,卡特兰数分治递推的应用。
(二)进阶例题:模型转化与边界处理
例题4 买票找零进阶版
题目:12个人排队买电影票,票价5元,6人仅持5元纸币,6人仅持10元纸币,售票员无初始零钱。请问:
- 仅考虑纸币类型,有多少种合法排队顺序?
- 若每个人都是不同个体,总方案数是多少?
思路:基础版对应卡特兰数 C6C6;人可区分时,需给两类人群分别排序,乘以对应排列数。
解答: 仅考虑纸币类型:n=6,
C6=17(126)=17×924=132C6=71(612)=71×924=132种。 人可区分的总方案数:6个持5元的人有 6!6! 种排列,6个持10元的人有 6!6! 种排列,总方案数为:C6×6!×6!=132×720×720=68428800C6×6!×6!=132×720×720=68428800
核心考点:有序与无序场景的区分,避免遗漏排列数。
例题5 不相交握手问题
题目:圆周上有8个点,编号1-8顺时针排列,每个点与另一个点握手,所有连线不能相交,求不同的握手方案数。
思路:2n个点的不相交握手方案数对应卡特兰数 CnCn,通过分治递推验证。
解答: 2n=8 ⟹ n=42n=8⟹n=4,方案数为 C4=14C4=14 种。
递推验证:选定点1,仅能和偶数号点握手(否则两侧点数为奇数,无法配对): 1和2握手:剩余6个点,方案数 C3=5C3=5; 1和4握手:左2个点、右4个点,方案数 C1×C2=2C1×C2=2; 1和6握手:左4个点、右2个点,方案数 C2×C1=2C2×C1=2; 1和8握手:剩余6个点,方案数 C3=5C3=5;
总和 5+2+2+5=145+2+2+5=14,与 C4C4 一致。
核心考点:环形问题的线性转化,卡特兰数分治递推的应用。
例题6 选票问题(广义卡特兰数)
题目:候选人A得m票,B得n票,m>n。求计票过程中,A的票数始终领先B的方案数。
思路:卡特兰数的通用推广,通过反射原理推导,又称Bertrand选票问题。
解答: 总方案数:从m+n个位置选m个给A,共 (m+nm)(mm+n) 种。 非法方案数:计票中出现A票数≤B的情况,通过反射原理得非法方案数为 (m+nm+1)(m+1m+n)。
合法方案数:
(m+nm)−(m+nm+1)=m−nm+n(m+nm)(mm+n)−(m+1m+n)=m+nm−n(mm+n)
特殊情况:当m=n时,要求A始终≥B,即卡特兰数 Cn=1n+1(2nn)Cn=n+11(n2n),与公式完全匹配。
核心考点:反射原理的通用应用,「≥」与「>」约束的公式区分。
5 易错点与注意事项
- 下标混淆:卡特兰数下标从0开始,C0=1C0=1 对应0对括号、0个节点的二叉树,切勿将 C1C1 作为首个值导致结果错误。
- 约束条件误判:必须严格满足「任意前缀A≥B」,若为「严格大于」,需调整公式,如m=n时严格领先的方案数为0,而非 CnCn。
- 有序与无序区分:卡特兰数计算的是「类型」的方案数,若元素可区分,需乘以对应排列数,如买票问题中不同个体需乘 n!⋅n!n!⋅n!。
- 数值溢出:卡特兰数增长极快,n≥20时需用大数类型或模运算,模运算中除法需用逆元处理。
- 模型转化错误:仅满足核心判据的问题可套用卡特兰数,并非所有组合计数都适用,如n个元素的全排列并非卡特兰阵计算和矩阵快速幂
更多推荐

所有评论(0)