卡特兰数学习笔记
简介
总之就是一个很神奇的数列:1,1,2,5,14,42,132……
可以由多种递推式、通项公式得出
运用相关思想,能够解决很多奇奇怪怪的计数问题
---
经典应用
长度为2n的括号序列个数
就类似()()()这种序列,每一个前括号,在它后面都有唯一一个后括号都能对应
考虑第一个左括号与第
最后f(n)即为卡特兰数第n项,这也是卡特兰数的递推式之一
在网格图中,在正方形右下方从(0,0)走到(n,n)的方案数
将问题描述得更加具体一点:
在网格图中,只允许向上或向右走,且不允许越过正方形连接(0,0),(n,n)的对角线,求总方案数
显然:往右走的步数等于往上走的步数,且路径不越过对角线,说明对于任意时刻,向上走的次数都不超过向下走的次数。换言之假设最后方案为一个向右向上的操作序列(如右上右右上上),对于序列中任意向右走的操作,在它右边都有唯一一个向上走的操作,这与括号序列的定义一致
所以该问题的答案为:
组合数优化
虽然我们求出了递推式,但是该递推式的复杂度为
考虑第二个例子
为了方便讨论,我们将在网格上的操作转换为在数轴上的操作。即将向右操作变为
这乍一看感觉不是很好统计。那我们不妨统计所有可能序列和所有不合法的序列,然后相减得出答案
统计所有可能序列非常简单,一共有
那么怎么统计不合法操作呢?接下来就是计算卡特兰数及相关问题最重点的部分:
我们考虑将路径到达点
取反后就是
我们将此操作在数轴上的路径称作取反路径(我自己瞎编的名字)
不难发现以下性质:
取反路径终点落在
由于我们在
也就是说,取反后,我们会继续向右走
取反路径与原非法路径一一对应
每一个非法路径都必然会经过
所以综上所述,
综上所述:原问题答案为:
这也是卡特兰数的公式
应用
对于这种对于操作a和操作b各有n次,要求满足任意时刻操作b的次数不能超过操作a,,求方案数的题目,都可以直接套卡特兰数的公式
比如:我没有零钱,现在有n个拿50元的顾客和拿100元的顾客,每一个拿100元的顾客都需要找零50,求排队方案数。很显然,就是说任意时刻拿100元的顾客数量都不超过拿50元的,答案直接就是
拓展
非常显然,并不是所有(事实上是几乎没有)题目会完全就是最基础的卡特兰数,大都会写一些奇奇怪怪(非常恶心)的题面。
先考虑最基础的拓展:有n个操作a和m个操作b,要求在任一时刻操作a与操作b数量之差不低于m。
我们还是按照原来的思路,把a当做
而计算所有非法方案数:、当每个方案到达数轴
此时我们会继续向右走
所以非法序列答案即为
最终答案即为:
个人感觉这是做题时最常用的式子,剩下的都是在这个基础上根据题目各种推式子
(本来计划加一些题目什么的,但貌似没有时间了,就先到这里吧)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现