卡特兰数(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]);
}
(2)

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)路径统计问题

从左上到右下(或从左下到右上)

posted @   zhengchenxi  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示