卡特兰数(Catalan)
1.简介:
卡特兰数是组合数学中一个常出现于各种计数问题中的数列。
十以内的卡特兰数,方便打表找规律,稍微记记。
1 2 5 14 42 132 429 1430 4862 16796
2.catalan递推式子
(1)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+100;
const int mod=1e9+7;
int n;
int dp[N];
void Catalan(int n)
{
dp[0]=1;dp[1]=1;
for(int j=2;j<=n;j++)
{
for(int i=0;i<j;i++)
{
(dp[j]+=dp[i]*dp[j-1-i]%mod)%=mod;
}
}
}
signed main()
{
scanf("%lld",&n);Catalan(n);
for(int i=1;i<=n;i++)
printf("%lld\n",dp[i]);
}
3.适用范围
(1)括号匹配
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
类似的,再来看一道例题:
买卖找零问题:
售票处售卖球票,每张票 50 元。有2n人前来买票
其中一半人手持 50 元钞票
另一半人手持 100 元钞票
若售票处开始没有任何零钱,问:有多少种排队方式,能够让售票顺畅进行。
思路:
把手持 50 元钞票的人视为左括
把手持 100 元钞票的人视为右括号
左右括号合法配对,即先出现左括号,再出现右括号,就可以让售票顺畅执行
可以看到,问题又变成了求解 n 的卡特兰数
(2)出栈顺序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
(3)凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。
(4)给定节点组成二叉搜索树
给定N个节点,能构成多少种不同的二叉搜索树。
(5)路径统计问题
从左上到右下(或从左下到右上)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话