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个节点,能构成多少种不同的二叉搜索树。
标签:括号,int,50,Catalan,100,卡特兰,dp From: https://www.cnblogs.com/zhengchenxi/p/18333335