【学习笔记】卡特兰数
卡特兰数
定义:
卡特兰数的计算公式涉及组合计数,它是很多组合问题的数学模型,是一个很常见的数列。
是一个数列,它的一种定义是:
卡特兰数有三个计算公式:
公式1:
适用于 较大的情况。
公式2:
适用于 较小的卡特兰数,不需要求逆元,复杂度 。
公式3:
接下来我们通过棋盘问题来推导公式1,通过二叉树问题来推导公式2。
应用
问题描述:现有一个 的棋盘,从左下角走到右上角,且一直在主对角线下面走,不能穿过主对角线,求路径的方案数。
这个限制等价于走到任意一步 都需要满足向右走的次数大于等于向上走的次数。
首先不考虑主对角线的限制,那么从 走到 的方案数为 ,组合意义为:
每一步我可以选择向上走(记为 )和向右走(记为 ),一共走 步,相当于一个长度为 的全部为 的序列,我们需要选择其中的 个位置将其填为 ,即 选 ,为 。
那么我们考虑加上这个限制,需要从总方案数上减去不合法方案数,我们看一种不合法情况:
如图,我们在对角线上面一格再画一个与其平行的对角线,可以发现只有所有穿过红线的路径(即不合法路径)才和蓝线有交,我们就是要统计这样的路径。
然后我们将这些路径在跨过红线后的部分关于蓝线对称:
可以发现这些线的终点都是 ,也就是 关于蓝线对称后的点,这些路径与原跨过红线的路径都是一一对应的,这部分的方案数同理是 ,即不合法的路径数量,所以合法的路径的数量的即为两者相减:
这正好就是卡特兰数的公式1。
问题描述:用 个左括号和 个右括号,求能组合出多少种合法的括号序列。
发现问题就是对于该字符串的任意长度前缀,都要满足左括号的数量大于等于右括号的数量,和上面的棋盘问题实际上是一样的,方案数为 。
问题描述:给定一个入栈序列,求有多少种不同的出栈序列?
对于每个数,都是入栈一次,出栈一次,对于每个时刻,只有栈的大小大于等于 才可以出栈,即每时每刻需要满足入栈次数大于等于出栈次数,还是卡特兰数、
问题描述: 个节点构成的二叉树,求有多少种不同的形态?
这个问题其实就是公式2的模型,设 为 子树分配 个点的答案,考虑从叶子节点往上递归。
对于叶子节点,
对于一个非叶子节点 ,设其左子树节点数量+右子树节点数量 ,则
为卡特兰数递推式。
没了。
本文来自博客园,作者:CCComfy,转载请注明原文链接:https://www.cnblogs.com/cccomfy/p/17794780.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!