1. Catalan 数计数(合法括号序列/二叉树个数/出栈序列)如何用 DP 递推 C_n = Σ C_i·C_{n-1-i} 与组合公式 C_n = C(2n,n)/(n+1) 两种方式计算
请解释 Catalan 数计数(合法括号序列、二叉树个数、出栈序列)如何用 DP 递推 C_n = Σ C_i·C_{n-1-i} 与组合公式 C_n = C(2n,n)/(n+1) 两种方式计算?
- Catalan 数的组合意义
- DP 递推 C_n = Σ C_i·C_{n-1-i}
- 组合公式 C_n = C(2n,n)/(n+1)
Catalan 数 C_n 计数多种等价结构:n 对合法括号序列数、n 个节点的二叉树个数、n 个元素出栈序列数等。DP 递推:C_0=1,C_n = Σ_{i=0}^{n-1} C_i·C_{n-1-i},即把解按"第一个元素/根的分割"分解为两个独立子问题(如括号序列的第一个匹配括号把序列分成 i 对外加 n-1-i 对,二叉树按根左右子树划分)。组合公式:C_n = C(2n,n)/(n+1) = (2n)!/((n+1)!·n!),可由反射原理推导(把合法括号序列与所有序列做差)。两种方式等价,DP 递推 O(n²) 适合中等规模,组合公式 O(n)(用阶乘与逆元)适合大规模。
Catalan 数的本质是"用递归分解计数":任何合法的 Catalan 结构都可以按第一个"根"分割成两个独立子结构,从而得到卷积递推。组合公式是递推的闭式解,两者给出计算上的灵活性。
long[] cat = new long[n + 1];
cat[0] = 1;
for (int i = 1; i <= n; i++) for (int j = 0; j < i; j++) cat[i] += cat[j] * cat[i - 1 - j];