卡特兰数

Catalan数(卡特兰数)

北城余情 提交于 2020-04-15 16:16:08
【推荐阅读】微服务还能火多久?>>> 由于Catalan数经常会在算法题或面试题中出现,在这里做一下小小的总结。 介绍 Catalan数是组合数学中一个常在各种计数问题中出现的数列。一般项公式为 Cn的另一个表达形式为 一般来讲,我们编程时用递推关系会更方便计算: 或 即:C(n) = C(1)*C(n-1) + C(2)*C(n-2) + … + C(n-1)C(1). 它的前几项为: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796。可以先通过前几项判断问题是否属于卡特兰数。 典型应用 这里有一本书介绍了66个相异的可由卡塔兰数表达的组合结构。 http://www-math.mit.edu/~rstan/ec/catadd.pdf (英文PDF) 1 括号化问题。矩阵链乘: P=A1×A2×A3×……×An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案? 2 一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words: XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY 3 将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数( 面试题参看算法篇第7题 ): ((())) ()(()) ()()()

组合数学---卡特兰数

百般思念 提交于 2020-02-19 15:10:57
long long f[25]; int main() { f[0] = 1; cin >> n; for (int i = 1; i <= n; i++) f[i] = f[i - 1] * (4 * i - 2) / (i + 1); //这里用的是常见公式2 cout << f[n] << endl; return 0; } View Code 可以解决的问题: 1.括号匹配问题,n对括号有多少种匹配方式? 2.进出栈问题,一个无穷大的栈,1,2,3...N 有多少种不同的出栈方式 3.二叉树种类问题:n个节点构成的二叉树,共有多少种不同情形 4.n*n的网格从左下走到右上角,不可走对角线,有多少种不同走法 5.凸多边形分割问题:求一个凸多边形区域划分成三角形区域的方法 6.集合划分问题:对于集合{1,2,3,...n}的不交叉划分的数目是多少 7.乘积重组问题:矩阵链乘P=a1*a2*a3*...an 8.连线不相交问题:在圆上有2n个点,将这些点连起来使得所得到的n条线段不相交的方法数 9.高矮排队问题:2n个高矮不同的人,每排必须是高到矮的顺序,而且第二排比第一排高,问排列的方式有多少种 10.门票找钱问题: 11. 来源: https://www.cnblogs.com/hznumqf/p/12331222.html

卡特兰数及其应用总结

寵の児 提交于 2020-02-16 21:27:13
优秀blog 优秀blog 卡特兰数 定义 卡特兰数是组合数学中一个常出现在各种计数问题中的数列。 给定n个0,n个1,排成2n的序列,满足:任意前缀中0的个数大于等于1的个数的排列方式种数,即为卡特兰数。 其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796 递推公式 设h(n)为catalan数的第n+1项,令h(0)=1,h(1)=1 h(n)= h(0) * h(n-1)+h(1) *h(n-2) + … + h(n-1) *h(0) (n>=2) eg : h(3)=h(0) *h(2)+h(1) *h(1)+h(2) *h(0)=1 *2+1 *1+2 *1=5 h(n)=h(n-1) * (4 * n-2) / (n+1); 递推关系的解为: h(n)=C(2n,n)/(n+1) (n=0,1,2,…) 递推关系的另类解为: h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…) 求卡特兰数—代码 用组合数算 组合数的计算 for ( int i = 0 ; i <= 4000 ; i ++ ) c [ i ] [ 0 ] = c [ i ] [ i ] = 1 ; for ( int i = 2 ; i <= n ; i ++ ) for ( int j = 1 ; j <= i

卡特兰数的规律

家住魔仙堡 提交于 2020-02-02 08:55:54
卡特兰数的规律 c a t a l a n ( n ) = ∑ i = 0 n − 1 c a t a l a n ( i ) × c a t a l a n ( n − i − 1 ) catalan(n)=\sum_{i=0}^{n-1}catalan(i)\times catalan(n-i-1) c a t a l a n ( n ) = i = 0 ∑ n − 1 ​ c a t a l a n ( i ) × c a t a l a n ( n − i − 1 ) c a t a l a n ( n ) = c a t a l a n ( n − 1 ) × ( 4 n − 2 ) n + 1 catalan(n)=\frac{catalan(n-1)\times(4n-2)}{n+1} c a t a l a n ( n ) = n + 1 c a t a l a n ( n − 1 ) × ( 4 n − 2 ) ​ c a t a l a n ( n ) = C 2 n n n + 1 catalan(n)=\frac{C_{2n}^n}{n+1} c a t a l a n ( n ) = n + 1 C 2 n n ​ ​ c a t a l a n ( n ) = C 2 n n − C 2 n n − 1 catalan(n)=C_{2n}^n-C_{2n

P1044 栈(卡特兰数)

本秂侑毒 提交于 2020-01-26 21:26:39
对于一个序列,有多少个出入栈序列 # include <iostream> using namespace std ; int n ; long long f [ 25 ] ; int main ( ) { f [ 0 ] = 1 ; cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) f [ i ] = f [ i - 1 ] * ( 4 * i - 2 ) / ( i + 1 ) ; //卡特兰公式 cout << f [ n ] << endl ; return 0 ; } 来源: CSDN 作者: Yun102400 链接: https://blog.csdn.net/qq_42188312/article/details/104089002

卡特兰数

混江龙づ霸主 提交于 2020-01-26 11:54:05
katalan H ( n ) h(n)表示,从原点出发,每次向x或y轴正方向移动1单位,到达点(n,n),且在移动过程中不越过第一象限平分线的移动方案数。 h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2) h(0)=1 ,h(1)=1 简化为h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,…) 卡特兰数的应用 1.像上面这样的正方形格子,只能走下半边,求能走的方式有多少种 引申:如果能把这个格子走的形式看作+1,-1 +1代表向上 -1代表向右 那么凡是可以这样表示的东西都可以用卡特兰数 比如 括号匹配 能有多少种方法 等这类出栈入栈问题 2.凸多边形三角划分 先任意选两个基边 再从其他点任意选一个点 再无限划分 3.再有就是二叉树 但是我不太会🤭 参考以下博客 https://blog.csdn.net/qq_43731019/article/details/99624344 来源: https://www.cnblogs.com/AAAzhuo/p/12233846.html

卡特兰数总结

浪尽此生 提交于 2020-01-03 15:15:13
卡特兰数又称卡塔兰数,是 组合数学 中一个常出现在各种计数问题中出现的 数列 。由以 比利时 的数学家欧仁·查理·卡塔兰 (1814–1894)命名。 卡特兰数 前几项为 ( OEIS 中的数列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ... 令h(1)=1,h(2)=1,catalan数满足递归式: 例如:h(3)=h(1)*h(2)+h(2)*h(1)=1*1+1*1=2  h(4)=h(1)*h(3)+h(2)*h(2)+h(3)*h(1)=1*2+1*1+2*1=5 若 h(0)=1;h(1)=1;h(2)=2;h(3)=5; ···· 有另类的递归式 另类递归式:    h(n)=h(n-1)*(4*n-2)/(n+1);   该递推关系的解为: h(n)=C(2n,n)/(n+1) (n=1,2,3,...) 卡特兰数的应用   实质上都是递归等式的应用 括号化  

卡特兰数

走远了吗. 提交于 2019-12-07 00:31:37
卡特兰数,一个常常出现在排列组合公式中的数列。 第n个卡特兰数 C n 满足以下递推关系 : 其实际应用的实际问题有: 1. 在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?(C n ) 2. 将一个凸多边形区域分成三角形区域(划分线不交叉)的方法数? 3. 一个栈的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? 4. 矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案? 5. 给定N个节点,能构成多少种不同的二叉搜索树? 6.有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈) 7.一位大城市的律师在他住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路? 结论区: 令h(0)=1,h(1)=1,catalan数满足以下表达式: 1. f(n) = f(0)*f(n-1) + f(1)*f(n-2) + f(2)*f(n-3)......+f(n-1)*f(0)。 2. f(n) = f(n-1)*(4

从一道动态规划到卡特兰数

不羁的心 提交于 2019-12-06 09:58:34
从一道动态规划到卡特兰数 LeetCode 96 题目链接: https://leetcode-cn.com/problems/unique-binary-search-trees/ 题意:给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? n = 3 时: 动态规划 思路:从 1 开始到 n ,每次以这个数为根,左子树存放比它小的数,右子树存放比它大的数。每个根不重复,因此每个树也必定不重复。 左子树和右子树,又可以按照这个规则去生成新的树。 例如:n = 3的时候 1为根: 比 1 小的数只有 0,不用管。比 1 大的数有 2 和 3。 拿 2 和 3 来生成一棵树和拿 1 和 2 来生成一棵树的种数是不是相同的?那么 1 和 2 能生成多少种树呢? 2为根: 比 2 小的是 1,比 2 大的是 3。这里只有 1 种。 3为根: 比 3 小的是 1 和 2,1 和 2 能生成多少种树呢? 我们先暂停思维,来到一个新的问题。 n = 2 的时候,结果应该是多少? n = 2 的时候,按照我们之前的方法。 1 为根:比 1 大的数只有 2, 这里有 1 种。 2 为根:比 2 小的数只有 1, 这里有 1 种。 那答案就应该是 2 种。 解决了 n = 2 的问题,那 n = 3 的问题就也解决了。 ans = 2 + 1 + 2 = 5。 我们来看一般情况

卡特兰数及其变形

二次信任 提交于 2019-12-03 04:56:53
题面 求n个左括号,n个右括号组成的所有序列中刚好有m对不匹配的序列总数. 分析 解法一 打表 打了2.5小时,几度自闭 解法二 易知m为0时答案即是卡特兰数,于是问题变成了合法序列个数的扩展问题。 回顾卡特兰数的证明,考虑折线法,从原点开始,遇见左括号斜向上画,遇见右括号斜向下画,所有线无论如何最后都会止于(2n,0)(因为向上向下次数一致),总数即是从原点到(2n,0)的方案数C(2n,n)(2n步中任取n步向上),m = 0要求左右括号完全匹配,则折线永远不能越过x轴(右括号过多不存在左括号与之匹配,不合要求)。要求合法序列个数可考虑合法 = 总数 - 不合法。刚才分析得越过x轴的线都不合法且不合法的线都必与y = -1相交,设第一次与y = -1相交的交点为k,将k以后的折线关于y = -1对称则必有(2n,0)对应(2n,-2),则不合法方案数转为从原点到(2n,-2),即等同于左括号比右括号少2个时的总方案数C(2n,n-1)(总数仍是2n,但有n-1个左括号,n+1个右括号)。 推广:由上分析知 至多m对不合法 = 总数 - 至少m + 1对不合法, 那么要求的 刚好m个 = 总数 - 至多m - 1对 - 至少m + 1对, 为C(2n,n) - (C(2n,n) - C(2n,n-m)) - C(2n,n-m-1); 推荐 组合数学—卡特兰数(catalan