卡特兰数问题

2023-11-07 01:59
文章标签 问题 卡特兰

本文主要是介绍卡特兰数问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接

卡特兰数 - http://lanqi.org/skills/10939/

数值

C0 = 1,         
C1 = 1,         C2 = 2,          C3 = 5,          C4 = 14,          C5 = 42,
C6 = 132,       C7 = 429,        C8 = 1430,       C9 = 4862,        C10 = 16796,
C11 = 58786,    C12 = 208012,    C13 = 742900,    C14 = 2674440,    C15 = 9694845,
C16 = 35357670, C17 = 129644790, C18 = 477638700, C19 = 1767263190, C20 = 6564120420, ...

公式

  • 通项公式一 C n = 1 n + 1 C 2 n n = C 2 n n − C 2 n n − 1 = C 2 n n − C 2 n n + 1 C_n = \frac{1}{n+1}C_{2n}^n=C_{2n}^n-C_{2n}^{n-1}=C_{2n}^n-C_{2n}^{n+1} Cn=n+11C2nn=C2nnC2nn1=C2nnC2nn+1

  • 通项公式二: C n = 1 n + 1 ∑ i = 0 n ( C n i ) 2 C_n = \frac{1}{n+1}\sum_{i=0}^n\left(C_{n}^i\right)^2 Cn=n+11i=0n(Cni)2

  • 递推公式一: C n + 1 = 2 ( 2 n + 1 ) n + 2 C n C_{n+1} = \frac{2(2n+1)}{n+2}C_n Cn+1=n+22(2n+1)Cn

  • 递推公式二 C n + 1 = C 0 × C n + C 1 × C n − 1 + … + C n − 1 × C 1 + C n × C 0 C_{n+1} = C_0\times C_n+C_1\times C_{n-1}+…+C_{n-1}\times C_1+C_n\times C_0 Cn+1=C0×Cn+C1×Cn1++Cn1×C1+Cn×C0

  • 增长速度: Δ C n ∼ 4 n n 3 2 × π \Delta C_n \sim \frac{4^n}{n^{\frac{3}{2}}\times\sqrt{\pi}} ΔCnn23×π 4n

通项公式一

  • 设由n+1个 -1 和 n-1个 +1 (或者:n+1个 +1 和 n-1个 -1 )组成长度为2n的序列A。所有的可能数量a1
    a 1 = ( 2 n ) ! ( n + 1 ) ! × ( n − 1 ) ! a_1=\frac{(2n)!}{(n+1)!\times(n-1)!} a1=(n+1)!×(n1)!(2n)!

  • 设由n个 +1 和 n个 -1 组成长度为2n的序列B。序列B若满足“前任意项的和不小于0”,则称该序列为合法序列,否则称非法序列

    • 所有非法的序列可能数量b1
      b 1 = a 1 = ( 2 n ) ! ( n + 1 ) ! × ( n − 1 ) ! b_1 = a_1=\frac{(2n)!}{(n+1)!\times(n-1)!} b1=a1=(n+1)!×(n1)!(2n)!
    • 所有合法的序列可能数量b2
      b 2 = ( 2 n ) ! n ! × n ! − b 1 = 1 n + 1 × ( 2 n ) ! n ! × n ! = 1 n + 1 × C ( 2 n , n ) b_2=\frac{(2n)!}{n!\times n!} - b_1 = \frac{1}{n+1} \times \frac{(2n)!}{n!\times n!} = \frac{1}{n+1} \times C(2n, n) b2=n!×n!(2n)!b1=n+11×n!×n!(2n)!=n+11×C(2n,n)
  • 为什么 b1 = a1

    • A序列和非法B序列,前若干项和第一次小于0的位置只能是1、3、5、……、2n-1
    • 根据第一次小于0位置对A序列、非法的B序列进行分类,都可以分为n类
    • 前若干项和第一次小于0时,此时的和一定等于 -1
    • 对于A序列,在2k+1位置第一次和小于0
      1 , … … , − 1 ⏟ k 个 ± 1 , − 1 , … … ⏟ n − k − 1 个 + 1 , n − k 个 − 1 \underbrace{1,……,-1}_{k个\pm1},-1,\underbrace{……}_{n-k-1个+1,n-k个-1} k±1 111nk1+1nk1
    • 对于非法B序列,在2k+1位置第一次和小于0
      1 , … … , − 1 ⏟ k 个 ± 1 , − 1 , … … ⏟ n − k 个 + 1 , n − k − 1 个 − 1 \underbrace{1,……,-1}_{k个\pm1},-1,\underbrace{……}_{n-k个+1,n-k-1个-1} k±1 111nk+1nk11
    • 结论:在2k+1位置第一次和小于0,对应的可能数量相等。因此b1 = a1 成立

递推公式二

  • 对于合法B序列,前若干项和第一次等于0的位置只能是 2,4,6,……,2n
  • 根据第一次等于0的位置对合法B序列进行分类,都可以分为n类
  • 分类后,每类由两个子问题构成;例如:在2k位置第一次和等于0
    1 , 1 , … … , − 1 ⏟ k − 1 个 ± 1 , − 1 ⏞ k 个 ± 1 , 1 , … … , − 1 ⏟ n − k 个 ± 1 \overbrace{1,\underbrace{1,……,-1}_{k-1个\pm1},-1}^{k个\pm1},\underbrace{1,……,-1}_{n-k个\pm1} 1k1±1 111 k±1nk±1 11
    对应的排列数:
    C k − 1 × C n − k C_{k-1} \times C_{n-k} Ck1×Cnk
    所以,总的排列数
    C n = C 0 × C n − 1 + C 1 × C n − 2 + C 2 × C n − 3 + … + C n − 1 × C 0 C_n = C_0\times C_{n-1}+C_1\times C_{n-2}+C_2\times C_{n-3}+…+C_{n-1}\times C_0 Cn=C0×Cn1+C1×Cn2+C2×Cn3++Cn1×C0

例题

  • 一个足够大的栈的进栈序列为1,2,3,…,n时有多少个不同的出栈序列?
    在这里插入图片描述

  • 圆周上有2n个点,以这些点为端点连互不相交的n条弦,求不同的连法总数.

在这里插入图片描述


  • 有n个结点,问总共能构成几种不同的二叉树.
    如中序遍历,根结点第k个被访问到,则根结点的左子树有k-1个点、根结点的右子树有n-k个点。k的取值范围为1到n。【2015年腾讯实习生在线笔试题】

  • 一个凸的n边形,用直线连接它的两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案。在这里插入图片描述

  • 有n+1个叶子的满二叉树的个数?
    在这里插入图片描述
    向左记为+1,向右记为-1,按照向左优先的原则,从根节点开始遍历.例如第一个图记为+1,+1,+1,−1,−1,−1。【即符合卡特兰数的含义】

  • 在n*n的格子中,只在下三角行走,每次横或竖走一格,有多少中走法? 在这里插入图片描述
    向右相当于进栈,向左相当于出栈。(这个模型是进出栈问题的一个几何解释)

  • 由n对括号形成的合法括号表达式的个数。
    • 当n=3时,合法的表达式共有:((())),(())(),()(()),()()(),(()()),共5个。
    • 表达式和指针结合可以视作乘法操作指令。指针:指向操作数,初始时刻,指针指向第一个数;左括号:指针右移一格;右括号:将指针当前指向的数与其左侧的一个数作乘积,并删除左侧的那个数。
    • 如图所示,1,2,3,4相乘时取n=3,当执行完括号表达式,就得到了一种可能的相乘顺序.
      在这里插入图片描述

  • n+1个数连乘,不同的乘法顺序数。
    【提示:可以为每种可能的相乘顺序找到一个对应的合法的括号表达式。】

  • 将一个凸n+2边形区域分成三角形区域的方法数?
    【提示:任选一条边,使得该边对应不同的顶点】 在这里插入图片描述

  • n个长方形填充一个高度为n的阶梯状图形的方法个数?
    【提示:每一个区域必属于某个矩形,去掉顶点区域所在的矩形,则易由递推公式推得。】 在这里插入图片描述

  • 在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数。
    【提示:下,下,上,上,……】

  • n+m个人排队买票,并且满足,票价为50元,其中n个人各手持一张50元钞票,m个人各手持一张100元钞票,除此之外大家身上没有任何其他的钱币,并且初始时候售票窗口没有钱,问有多少种排队的情况数能够让大家都买到票。
    【提示:50,50,100,100,……】

这篇关于卡特兰数问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/360506

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决