浅谈卡特兰数(Catalan number)的原理和相关应用
一、卡特兰数(Catalan number)
1.定义
组合数学中一个常出现在各种计数问题中出现的数列(用c表示)。以比利时的数学家欧仁·查理·卡特兰的名字来命名;
2.计算公式
(1)递推公式
c[n]=Σ(0≤k<n)c[k]c[n-k-1],边界条件为c[0]=1;
其递推解为c[n]=C(2n,n)/(n+1),即卡特兰数的通项公式,其中C表示数的组合;
根据组合公式我们可以化简得c[n]=2n(2n-1).....(n+2)/n!;
(2)另类递推式
c[n]=c[n-1](4n-2)/(n+1),边界条件为c[0]=1;
其递推解为c[n]=C(2n,n)-C(2n,n-1),C表示数的组合;
(3)其他公式
c[n]=(Σ(0≤i≤n)C(i,n)^2)/(n+1);
ps:通过展开可以发现它们的本质是一样的;
3.简单应用
(1)求解路径方案数:如图所示,从原点(0,0)到点B(n,n),只能向右或向上进行长度为一个单位的移动,路线一直处于y=x之下(不越过直线y=x)的不同路径方案数;
Solution:每个n的解都可以看做先前的解数(再向右向上即为所求)加上不触及各个y=x上的点到达B点的方案数,可以发现其递推公式即为卡特兰数计算公式;
(2)求01串的个数:n个0与n个1构成的序列方案数,使得任何一个前缀0的个数不少于1的个数;
Solution:将0看做在坐标系中向右走一步,1看做向上走一步,则问题可化简为从原点到(n,n)所有路线中一直处于y=x之下(不越过直线y=x)的不同路径方案数,与上题相同,方案数即为对应n的卡特兰数;
(3)给定节点求解二叉树的个数:已知由n个节点,求形成不同的二叉树有多少种?
Solution:将向左生成子树看做0,向右生成字数看成1,则问题化简为求n/2个0和n/2个1构成数串的不同方案数,即上题无条件解的一半,与上题答案相同,形成不同的树的个数即为对应n的卡特兰数;
(4)求凸边形进行三角剖分的不同方案数:在一个有n+3条边的凸多边形中,求通过若干条互不相交的对角线,把这个多边形划分成若干个三角形的不同方案数。
Solution:因为每一条边都一定是剖分后的三角形的一条边,任意一条边都会把多边形分成两个小多边形,那么根据乘法原理,解即为划分成不同多边形的方案数对应小多边形的划分方案数之和,即f[n]=Σ(3≤k≤n-3)f[k]f[n-k-1],可以发现解数即为n对应的卡特兰数;
(5)n对括号正确匹配数目:给定n对括号,求括号正确配对的字符串数;
Solution:因为是匹配问题,那么最后一个左括号必然有唯一右括号与其匹配,假设f[n]为n对括号的正确配对数目,那么有递推关系f[n]=f[0]f[n-1]+f[1]f[n-2]+...+f[n-1]f[0],显然f[n]是n对应的卡特兰数。
4.卡特兰数的扩展(折线原理)
对于在n位的2进制中,有m个0,其余为1的catalan数为:C(n,m)-C(n,m-1)。其可由应用(1)证明;
二、相关应用
1.[NOIP2003]栈
题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8481413.html
2.[洛谷P1722]矩阵II
Description
给定一个长度为2n的数列,现让你自由地放入红色算筹和黑色算筹,求对于所有的i(1<=i<=2n),使第1~i格中红色算筹个数大于等于黑色算筹的方案数;
输入:n
输出:对100取模后的方案数;
Solution
1.将红看做入栈操作,黑看为出栈操作,问题即为求不同的合法的入栈出栈序个数;
2.那么解法与上题相同,易得解即为对应的卡特兰数;
3.我们可以考虑用递推式(1)求卡特兰数,取模更容易;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
unsigned long long ctl[110],i,j,k,n;
memset(ctl,0,sizeof(ctl));
ctl[0]=ctl[1]=1;
ctl[2]=2;
scanf("%d",&n);
for(i=3;i<=n;++i)
for(j=0;j<i;++j){
ctl[i]+=ctl[j]*ctl[i-j-1];
ctl[i]%=100;
}
printf("%d\n",ctl[n]);
return 0;
}
3.[洛谷P1976]鸡蛋饼
Description
最近小 x 又发现了一个关于圆的有趣的问题:在圆上有2N 个不同的点,小 x 想用 N 条线段把这些点连接起来(每个点只能连一条线段), 使所有的线段都不想交,他想知道这样的连接方案有多少种?
输入输出格式
输入格式:有且仅有一个正整数 N
输出格式:要求的方案数(结果 mod 100000007)。
Solution
1.可将问题化简为求n+3边形进行三角剖分的方案数,解法就显而易见了;
2.对1e8+7取模可以考虑使用递推公式(1)解决;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
unsigned long long ctl[32768],i,j,k,n;
memset(ctl,0,sizeof(ctl));
ctl[0]=ctl[1]=1;
ctl[2]=2;
scanf("%d",&n);
for(i=3;i<=n;++i)
for(j=0;j<i;++j){
ctl[i]+=ctl[j]*ctl[i-j-1];
ctl[i]%=100000007;
}
printf("%d\n",ctl[n]);
return 0;
}
4.[AHOI2012]树屋阶梯
题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8481432.html
5.[HNOI2009]有趣的数列
题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8481448.html
6.[SCOI2010]生成字符串(卡特兰数的扩展)
题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8481454.html
浅谈卡特兰数(Catalan number)的原理和相关应用的更多相关文章
- 卡特兰数 catalan number
作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- 卡特兰数(Catalan Number) 算法、数论 组合~
Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...
- 【知识总结】卡特兰数 (Catalan Number) 公式的推导
卡特兰数的英文维基讲得非常全面,强烈建议阅读! Catalan number - Wikipedia (本文中图片也来源于这个页面) 由于本人太菜,这里只选取其中两个公式进行总结. (似乎就是这两个比 ...
- 卡特兰数(Catalan Number) 学习笔记
一.三个简单的问题 1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数 2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案 ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 浅谈Eclipse调用Tomcat服务的原理
浅谈Eclipse调用Tomcat服务的原理 转:http://www.thinksaas.cn/group/topic/341645/ 转:http://www.173it.cn/Html/?581 ...
- ACM数论-卡特兰数Catalan
Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...
- 卡特兰数 Catalan 笔记
一.公式 卡特兰数一般公式 令h(0)=1,h(1)=1,catalan数满足递推式.h(n) = h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>= ...
随机推荐
- virsh 命令行管理虚拟机
重用命令和选项 1:查看运行的虚拟机 virsh list 2:查看所有的虚拟机(关闭和运行的虚拟机) virsh list --all 3:连接虚拟机 virsh console +域名(虚 ...
- apache反向代理服务器
1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代理服务器) 适用于: ①局域网的代理服务器 ...
- [转帖]Linux 的UTC 和 GMT
1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...
- Maven 私服安装和启动
在安装私服的时候容易碰到的两个问题,一个是安装时拒绝访问,另一个是安装完成后服务无法启动: 拒绝访问问题: 原因:没有以管理员身份运行 cmd 解决办法: 如果是 win7 的话,可以直接在 [运行- ...
- BZOJ5016 Snoi2017一个简单的询问(莫队)
容易想到区间转化成前缀和.这样每个询问有了二维坐标,莫队即可. #include<iostream> #include<cstdio> #include<cmath> ...
- 笔记-自己看Day20-待续
1. 搭建环境 1)注释掉csrf 2)配置模板路径 'DIRS': [os.path.join(BASE_DIR,'templates')], # BASE_DIR,代指当前目录. 3)配置静态文 ...
- "XX cannot be resolved to a type "eclipse报错及解决
好久都没有写博了,还记得自己准备考研,结果你会发现——你永远不知道,你将会走上哪个路. 长远的目标是好的,但有些时候身不由己也迫不得已!做好自己的当下就是好的. 不论搞什么,总会遇到各种各样的问题,以 ...
- 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)
[BZOJ2780][SPOJ]Sevenk Love Oimaster(后缀自动机) 题面 BZOJ 洛谷 题解 裸的广义后缀自动机??? 建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括 ...
- 洛谷P3933 Chtholly Nota Seniorious 【二分 + 贪心 + 矩阵旋转】
威廉需要调整圣剑的状态,因此他将瑟尼欧尼斯拆分护符,组成了一个nnn行mmm列的矩阵. 每一个护符都有自己的魔力值.现在为了测试圣剑,你需要将这些护符分成 A,B两部分. 要求如下: 圣剑的所有护符, ...
- Dirichlet 卷积学习笔记
Dirichlet 卷积学习笔记 数论函数:数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值或复值函数,更一般地,也可把数论函数看做是某一整数集上定义的函数. 然而百科在说什么鬼知道呢, ...