首页 > 其他分享 >卡特兰数小记

卡特兰数小记

时间:2024-02-11 21:11:49浏览次数:27  
标签:括号 2i Catalan 序列 mathcal 2n 卡特兰 小记

引入

  1. \(n\) 个节点的二叉树个数。
  2. 长度为 \(2n\) 的合法括号序列数量。

不加说明的给出结论:上面两个问题的答案均为卡特兰数列 \(H\) 的第 \(n\) 项,\(H_n\)。

暴力 DP 理解

第一个问题

设 DP 状态 \(f(i)\) 为 \(i\) 个节点的二叉树个数。

求 \(f(i)\) 时,枚举左儿子节点数量 \(j\)、得到右儿子节点数量 \(i-1-j\)。

两部分方案数 \(f(j)\)、\(f(i-1-j)\)​ 乘起来得到这种情况下的方案数。

\[f(i)= \begin{cases} 1 & i=0\\ \sum\limits_{j=0}^{i-1}f(j)f(i-1-j) &i > 0 \end{cases} \]

上述转移即为定义 Catalan 数列的递推关系(虽然一开始求解的问题不是此问题)。

如果要通过此方法求出卡特兰数列的第 \(n\) 项,预处理复杂度 \(\mathcal O(n^2)\),查询复杂度 \(\mathcal O(1)\)​。

第二个问题

通过一些括号序列的知识,该问题等价于将 ( 视为 \(1\),) 视为 \(-1\),同时每个位置的前缀和 \(\ge 0\) 的序列的个数。

那么可以设 DP 状态 \(f(i,j)\) 表示,已经填了 \(i\) 个数,\(i\) 个数总和为 \(j\) 的序列个数。

容易得到转移式:

\[f(i,j)= \begin{cases} f(i-1,j+1)& j = 0 \\ f(i-1,j-1)+f(i-1,j+1) & 0 < j \le i \\ 0 &\text{otherwise.} \end{cases} \]

回到原问题上,方案数为 \(f(2n,0)\)​。

预处理复杂度 \(\mathcal O(n^2)\),查询复杂度 \(\mathcal O(1)\)。

证明它是 Catalan

根据第一个问题的引入,写出 Catalan 数的定义递推公式

\[H_n= \begin{cases} 1 & n = 0\\ \sum\limits_{i=1}^{n}H_{i-1}H_{n-i} & n > 0 \end{cases} \]

Call Back

而对于第二个问题如何证明它也是 Catalan 数呢?

考虑得到新的转移式。

设 \(f(n)\) 为长度为 \(2n\) 的合法括号序列数量。

枚举 \(i\),统计满足 \(1\sim 2i\) 为合法括号序列最短前缀 的括号序列数量。划分为两个子问题。

  • \(1\sim 2i\) 为合法括号序列,同时需要保证 \(1\sim 2i\) 不存在更短的前缀,满足其为合法括号序列。

    那么这部分括号序列第 \(1\) 位一定为 (,第 \(2i\) 位一定 )。(充要条件)

    这部分方案数为 \(f(i-1)\)。

  • \(2i+1\sim 2n\) 为合法括号序列,方案数为 \(f(n-i)\)。

这样就能够得到和 Catalan 数列的一样的递推公式。即能证明第二问题的答案也为 Catalan 数。

卡特兰数列可以应用的问题

以下问题的答案均为 \(H_n\)。

  1. 凸 \(n+2\) 边形的三角形划分方案数。

    最早被发现答案为 Catalan 数的问题。

    写出该问题的递推式即可证明其为 Catalan 数。

  2. \(n\)​​​ 个节点的二叉树个数。

    引入的问题。

  3. 长度为 \(2n\)​​ 的合法括号序列数量。

    引入的问题。

  4. 给定圆上 \(2n\) 个点,将这些点成对连接所得到的 \(n\)​​​ 条线段不相交的方案数

    【P1976】鸡蛋饼 【P1375】小猫

    证明:写出递推式!

  5. \(n\) 个矩形填充长宽为 \(n\)​ 的阶梯图形的方案数。

    【P2532】[AHOI2012] 树屋阶梯

    枚举第 \(n\) 列的矩形的长度 \(h\)(它的形状只能为 \(1\times h\))能够转成求两个子阶梯的填充方案数。

    写出递推式后即能证明其为 Catalan 数。

  6. 长度为 \(2n\) 的排列 \(p\),满足 \(p_1 < p_3 < \dots < p_{2n-1}\);\(p_2 < p_4 < \dots < p_{2n}\) ;\(p_{2i-1}<p_{2i}\)​ 的个数。

    【P3200】[HNOI2009] 有趣的数列

    首先需要观察出 \(p_{2i}\) 为 \(1\sim 2i\)​​ 的最大值。

    将 \(1\sim 2n\) 从小到大分成奇偶位填入。

    由于上面的性质,填数 \(i\) 时,需要保证每次填完 \(i\) 后,填入奇数位的数不少于填入偶数位的数。

    等价于合法括号序列方案数,答案即为 \(H_n\)​。

有很多能够轻易转化为合法括号序列方案数的问题就不写了。

背下 Catalan 数列有助于找规律。推导尽量往经典模型上靠不拘泥于一种模型

\(H_0\) \(H_1\) \(H_2\) \(H_3\) \(H_4\) \(H_5\) \(H_6\) \(\dots\)
1 1 2 5 14 42 132 \(\dots\)

通项 / 快速计算

\(\mathcal O(n^2)\) 预处理太慢了!考虑更快的方法!

考虑长度为 \(2n\) 的序列 \(a\),\(a_i\) 为 \(1\) 或 \(-1\),同时 \(\forall i\in [1,n]\),\(\sum\limits_{j=1}^{i}a_j\ge 0\)。\(H_n\) 即为满足条件的 \(a\) 的个数。

正难则反。首先 \(a\) 中有 \(n\) 个 \(1\),\(n\) 个 \(-1\),方案数为 \(\binom {2n} n\)。考虑在这样的 \(a\) 中不满足条件的 \(a\) 的个数。

找到最小的满足 \(\sum\limits_{j=1}^{i}a_j<0\) 的 \(i\)(既然不满足条件,那么一定存在这样的 \(i\))。

转化:将 \([i+1,n]\) 全部取相反数,得到序列 \(a'\)。

序列 \(a'\) 会满足 \(\sum\limits_{i=1}^{n}a'_i=-2\)。\(a'\) 中有 \(n-1\) 个 \(1\),\(n+1\) 个 \(-1\)。

现在证明:\(a'\) 数量与不满足条件的 \(a\) 序列数量相同。

  • 每个不满足条件的 \(a\) 能够对应到不同的 \(a'\)。考虑构造 \(a'\) 的过程即能说明。(充分性)

  • 每个 \(a'\) 能够对应到不满足条件的 \(a\)。

    找到最小的满足 \(\sum\limits_{j=1}^{i}a'_j<0\) 的 \(i\)(一定存在,\(a'\) 总和 \(<0\)),将 \([i+1,n]\) 取反即能够对应到不满足条件的 \(a\)​​。

    根据上述构造,\(a'\) 对应到的 \(a\) 是两两不同的,得证。(必要性)

那么可以得到:

\[H_n=\binom {2n} n-\binom {2n}{n-1}\\ H_n=\binom {2n} n-\binom {2n}{n+1}\\ H_n=\dfrac{\binom{2n}{n}}{n+1}\\ H_n=\dfrac{2n!}{(n+1)!n!} \]

于是当模数为质数时,能够 \(\mathcal O(n)\) 预处理阶乘、阶乘逆元 \(\mathcal O(1)\) 计算。

标签:括号,2i,Catalan,序列,mathcal,2n,卡特兰,小记
From: https://www.cnblogs.com/sprads/p/18013531

相关文章

  • 耳分解小记
    EarDecomposition耳:对于无向图\(G=(V,E)\)和\(V\)的一个子集\(S\),定义一个耳为一个顶点序列\(a_1\sima_m\),满足\(a_2\sima_{m-1}\inV-S\)互不相同且和\(a_1,a_m\)不同,且\(a_i\)和\(a_{i+1}\)之间均有连边。其中\(a_1\neqa_m\)时称为开耳。耳分解......
  • Irrlicht 小记
    1.irrlicht名称空间下包含corescenevideoiogui2.irrlicht的事件可以监听页面事件、鼠标事件、按键事件——但是具体响应根据程序结构有所区分(例子中的按键响应处理部分扔到了引擎循环部分;而界面响应通过记录场景指针,直接在自定义场景响应类内进行的处理)3.irrlicht......
  • supervisor命令小记
    查看已启动服务状态supervisorctlstatus查看某个服务状态supervisorctlstatus进程名启动某个进程supervisorctlstart进程名重启某个进程supervisorctlrestart进程启动名停止某个进程supervisorctlstop进程名修改或添加某个服务配置文件后,使其......
  • 动态树直径小记
    本文采用BY-NC-SA协议发布。要求:给你一棵树,边带权,每次断边连边(保证合法且仍是树),在线求每次修改后的直径。LCT(咕)TopTree拆边,然后用negiizhao论文里的方法维护。实现时注意,翻转标记会影响合并的信息,要swap一下。#include<iostream>#include<unordered_map>#includ......
  • 关于卡特兰数
    不那么有意思的定义卡特兰数\(\big(Catalan\big)\)用\(H\)来表示,有形式如:\(H_n=\dfrac{\binom{2n}n}{n+1}(n\geq2)\)很好,你已经知道定义了。老师说:它是栈出栈入栈的\(方案数\)\(???\)放到一个递推式就有了:\(H_n=\begin{cases}H_{n-1}+H_{n-2}&\text{if}......
  • 【小记】Docker容器间SSH公钥自动交换实现免密登录的一次尝试
    咋想到这茬了最近开始忙毕设的事儿了,想部署个伪分布式的Spark+Hadoop集群来进行测试。思来考去,最终咱把目光放在了Docker上。盘了两天,发现这玩意意外的有趣,镜像构建好后开箱即用,省去了些配置环境的成本。不过呢,在配置Hadoop的时候我发现了一个问题——Hadoop分布式搭建要求各......
  • 在.framework框架下的winfrom中使用Castle.DynamicProxy实现AOP问题小记
    1.需求:为项目中通讯PLC模块实现AOP,实现统一的日志打印,参数校验,方法执行时间统计2.问题:①现有项目没有IOC容器,没法使用部分AOP库的方法注册到IOC,(注:如果要实现IOC对现有代码改动大,并且AOP只是针对部分模块实现)②要在尽量小的代码改动下实现针对以上问题选择使用Castle.DynamicProx......
  • 【小记】MSMF 框架开发 UVC 摄像头如何正确设置 MF_MT_SUBTYPE
    简单说一下:IMFSourceReader有两个可以获取 IMFMediaType对象的接口,分别是 GetNativeMediaType与 GetCurrentMediaType。初始化时调用 GetCurrentMediaType获得的IMFMediaType对象(此时为硬件默认情况下自动选择的对象)再进行修改是不能用于SetCurrentMediaType的,即......
  • CF-1831-E-卡特兰数+异或哈希+差分
    1831-E题目大意给定一个整数\(n\),和\(k\)个区间,区间端点范围在\([1,n]\)内。如果有一个长为\(n\)合法的括号序列,且它的这\(k\)个区间\([l,r]\)中的子括号序列也是合法的,那么称这个括号序列是“好的”。请你求出有多少个长度为\(n\)的“好的”括号序列,答案对\(998244353\)取模......
  • Linux中关于磁盘的一些常见问题小记
    1.程序导致内存不够用程序导致内存不够用如果内存满则系统会自动杀死占用内存最高的进程来保护系统正常运行什么原因导致内存满:1.大量用户访问服务器(正常情况)需要我们添加内存2.由于程序导致内存满,而不是大量用户访问导致(找开发解决)3.由于网络的波动导致内存满需要......