对卡塔兰数的理解

卡塔兰数定义

f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)

      = f(k-1)f(n-k) k=1...n

以k为轴划分子问题,左边子问题的解的个数和右边子问题的解的个数是原问题以k为轴的解法的2个独立步骤,适用乘法原理

分别以1,2,。。。n为轴,是原问题的n种解法,适用加法原理。

与卡塔兰数有关问题通常满足如下描述:有一个大问题A,规模为n,要解决这个问题,可以用分治的思想,首先固定其中某一个元素,将剩下的n-1个元素拆分成两个小问题,这两个小问题的规模分别是(0,n-1) (1,n-2) (2,n-3) ... (n-1,0)

举几个例子:
1. 二叉树计数,n个结点的二叉树,首先固定根节点,将剩下的n-1个结点拆分给左右子树
2. 三角形划分问题,凸(n+2)边形可以划分为n个三角形,首先固定一条边(即一个三角形),这个三角形将这个(n+2)边形拆分成两个更小的多边形。

有关卡塔兰数详细的数学证明,性质和应用,查阅维基百科卡塔兰数

有关卡塔兰数的几何证明(折线),参考某博主的博客卡塔兰数

下面是一个简单的卡塔兰数应用:

就跟斐波那契数列一样,我们把n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为跟,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

dp[2] =  dp[0] * dp[1]   (1为根的情况)

    + dp[1] * dp[0]    (2为根的情况)

同理可写出 n = 3 的计算方法:

dp[3] =  dp[0] * dp[2]   (1为根的情况)

    + dp[1] * dp[1]    (2为根的情况)

     + dp[2] * dp[0]    (3为根的情况)

原文地址:https://www.cnblogs.com/lidan-prime/p/9059631.html

时间: 2024-10-01 06:14:15

对卡塔兰数的理解的相关文章

卡塔兰数简介

卡塔兰数(Catalan) 一.简介: 卡塔兰数是一个特殊的数列,在ACM程序设计.组合数学中会经常见到. 二.性质 (1)卡塔兰数的前几项 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 12899

catalan卡塔兰数

令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),这是n阶递推关系;还可以化简为1阶递推关系: 如h(n)=(4n-2)/(n+1)*h(n-1)(n>1) h(0)=1该递推关系的解为:h(n)=C(2n,n)/(n+1)=P(2n,n)/(n+1)!=(2n)!/(n!*(n+1)!) (n=1,2,3,...) 1 #include <iostream>

卡塔兰数(Catalan)

卡塔兰数(Catalan) 原理: 令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) 比如: h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2 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=

HDOJ 1023 Train Problem II (卡塔兰数)

Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. Input The input contains se

递归输出所有出栈次序及卡塔兰数应用

用ArrayList模拟栈的操作,采用递归算法.代码如下: 1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class stackAll { 5 static int num=0; 6 public static void main(String[] args) { 7 Scanner scanner=new Scanner(System.in); 8 int n=scanner.nextInt();//输

排列组合 - 卡塔兰数的应用

卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.输入一个整数n,计算h(n). h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关系的解为:h(n)=C(2n,n)/(n+1) (n=1,2,3,...) int Catalan(int n) { if(n <= 1) return 1; int *h = new int [n+1]; h[0] = h[1] = 1; for(

也谈卡塔兰数

引例一:2n个人排队买票,其中n个人持50元,n个人持100元.每张票50元,且一人只买一张票.初始时售票处没有零钱找零.请问这2n个人一共有多少种排队顺序,不至于使售票处找不开钱? 引例二:括号匹配,n个左括号,n个右括号,求合法组合数目. 引例三:1表示进栈,0表示出栈.n个0,n个1的合法排列. 引例四:对于一个无限大的栈,一共n个元素,请问有几种合法的入栈出栈形式? 引例五:P = a1 * a2 * a3 * ... * an,其中ai是矩阵.根据乘法结合律,不改变矩阵的相互顺序,只用

网站并发数的理解

想要探讨这个概念,源于某个攻击事件.某个应用平台遭到外部攻击,导致apache连接数冲高,平台使用缓慢.通过日志分析平台来看,从平台遭遇攻击起,apache请求数在不断下降,与之前的认知有所不同. 之前认为apache请求数在遭遇攻击时,应该不断增加才是.实则这个请求数可以理解为并发数,就引出"网站并发数"的概念. 对于网站服务器而言,网站并发数,可以理解为,在单位时间内,服务器能够同时处理的最大请求数.由于请求业务的不同,有的请求1秒内结束,有的请求10秒内结束.因此,网站并发并不是

浅析安卓和苹果的架构区别,为何苹果顺畅安卓卡?适合新手理解

iOS对屏幕反应的优先级是最高的,它的响应顺序依次为Touch--Media--Service--Core架构,当用户触摸接触了屏幕时,系统最先去处理屏幕显示也就是Touch这个层级,然后才是媒体.服务以及Core架构等.而Android系统的优先级响应层级则是Application--Framework--Library--Kernal架构,和显示相关的图形处理属于Library,被“放到”了第三位.一句话概念就是,当你触摸屏幕之后Android系统首先会激活应用框架,然后是屏幕,最后是核心架