【概述】

卡特兰数列是组合数学中一个常出现在各种计数问题中出现的数列,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ......

卡特兰数首先是由欧拉在计算对凸 n 边形的不同的对角三角形剖分的个数问题时得到的,即在一个凸 n 边形中,通过不相交于 n 边形内部的对角线,把 n 边形拆分成若干三角形,不同的拆分数目用 Hn 表示,Hn 即为卡特兰数。

【公式】

1.递归公式 1

2.递归公式 2

3.组合公式 1

4.组合公式 2

【应用】

  1. 二叉树的计数:已知二叉树有 n 个结点,求能构成多少种不同的二叉树
  2. 括号化问题:一个合法的表达式由()包围,()可以嵌套和连接,如:(())()也是合法表达式,现给出 n 对括号,求可以组成的合法表达式的个数
  3. 划分问题:将一个凸 n+2 多边形区域分成三角形区域的方法数
  4. 出栈问题:一个栈的进栈序列为1,2,3,..n,求不同的出栈序列有多少种
  5. 路径问题:在 n*n 的方格地图中,从一个角到另外一个角,求不跨越对角线的路径数有多少种
  6. 握手问题:2n 个人均匀坐在一个圆桌边上,某个时刻所有人同时与另一个人握手,要求手之间不能交叉,求共有多少种握手方法

【实现】

1.n<=35 的卡特兰数的实现

LL h[36];
void init() {h[0]=h[1]=1;for(int i=2; i<=35; i++) {h[i]=0;for(int j=0; j<i; j++)h[i]=h[i]+h[j]*h[i-j-1];cout<<h[i]<<endl;}
}

2.n<100 的卡特兰数的实现

#define BASE 10000
int a[100+5][100];
void multiply(int num,int n,int b) {//大数乘法int temp=0;for(int i=n-1; i>=0; i--) {temp+=b*a[num][i];a[num][i]=temp%BASE;temp/=BASE;}
}
void divide(int num,int n,int b) {//大数除法int div=0;for(int i=0; i<n; i++) {div=div*BASE+a[num][i];a[num][i]=div/b;div%=b;}
}
void init(){memset(a,0,sizeof(a));a[1][100-1]=1;for(int i=2; i<=100; i++) {memcpy(a[i],a[i-1],sizeof(a[i-1]));multiply(i,100,4*i-2);divide(i,100,i+1);}
}
int main() {init();int n;while(scanf("%d",&n)!=EOF){int i;for(i=0;i<100 && a[n][i]==0;i++);printf("%d",a[n][i++]);for(;i<100;i++)printf("%04d",a[n][i]);printf("\n");}return 0;
}

【例题】

  • 小兔的棋盘(HDU-2067)(n<=35的卡特兰数):点击这里
  • Game of Connections(POJ-2084)(n<100的卡特兰数):点击这里
  • 小a的学期(2019牛客寒假算法基础集训营 Day1-H)(卡特兰数列+组合数取模):点击这里

组合数学 —— 卡特兰数列(Catalan)相关推荐

  1. 卡特兰数列(Catalan)

    简介 卡特兰数又称卡塔尔数,是组合数学中一个常出现在各种计数问题中的数列.其前几项为: 1, 2, 5, 14, 42, 132, 429, - 朴素递推公式 快速计算公式 递推公式2: h ( n ...

  2. 卡特兰数列(Catalan )

    简述 卡特兰数又称卡塔兰数,它是组合数学中一个常出现在各种计数问题中出现的数列,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 587 ...

  3. 算法基础 - 数论 | 组合数学 卡特兰数(Catalan number)定义、证明及例题

    写在前面:卡特兰数这东西感觉挺常用的,并且公式很简单,那就花一下午总结一下,学点皮毛吧(反正遇到我还是不会 ) [PDF] 大三上组合数学课堂讲义 文章目录 卡特兰数定义 卡特兰数的性质 卡特兰数证明 ...

  4. 卡特兰(Catalan)数列

    卡特兰数又称卡塔兰数,英文名 Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1 ...

  5. 卡特兰(Catalan)数

    参考:http://lanqi.org/skills/10939/ 卡特兰(Catalan)数来源于卡特兰解决凸n+2边形的剖分时得到的数列Cn,在数学竞赛.信息学竞赛.组合数学.计算机编程等方面都会 ...

  6. 卡特兰数catalan证明及应用举例

    卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.其计算公式是 Cn=Cn2nn+1=(2n)!(n+1)!n!,n为自然数 C n = C 2 n n n + 1 = ( 2 n ) ! ( n ...

  7. 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)

    「BZOJ1485」[HNOI2009] 有趣的数列   Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...

  8. 卡特兰数 Catalan number

    卡特兰数 Catalan number 卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 74290 ...

  9. ZZNU-OJ-2119 : 告辞,【卡特兰数列,组合数学】

    2119 : 告辞 时间限制:1 Sec 内存限制:256 MiB 提交:428 答案正确:102 提交 状态 编辑 讨论区 题目描述 整个世界都在散发着恋爱的恶臭,只有spring依旧保持着单身贵族 ...

最新文章

  1. python学哪些东西_想要自学Python ,需要准备什么东西?
  2. 20169207 2016-2017-2 《网络攻防实践》 黑客资料总结
  3. 一直认为 count(1) 比 count(*) 效果高,被同事鄙视了。
  4. 关于apache kylin 安装32位linux办法
  5. 面经系列 | Python,数据结构,神经网络
  6. Dynamics CRM 访问团队的使用
  7. Windows系统端口转发
  8. SCOM 2007 R2监控系统安装部署(二)安装Operation Manager 2007 R2管理服务器
  9. C# Windows 窗体的.Net 框架绘图技术
  10. 两分钟教你玩转千图成像Part1~
  11. 常用存储器(SRAM、DRAM、NVRAM、PSRAM)简单介绍
  12. 从eclipse官网下载32位eclipse并配置tomcat
  13. HTTP 405 错误 – 方法不被允许 (Method not allowed)【转载】
  14. uniapp使用ucharts图表及问题汇总
  15. HTML5排序罗马数字,HTML5 罗马数字时钟
  16. [基础算法] 并查集
  17. 2019-11-29-git-需要知道的1000个问题
  18. pycharm下载第三方库需要更新pip报错No module named pip
  19. php youtube 信息,如何通过php 获取Youtube某个User所有Video信息
  20. php 飞信接口 2013,php飞信每日自动天气预报 v1.0

热门文章

  1. 华为鸿蒙OS 2.0 发布,18点18分开放源代码
  2. 清华新生C++作业难上热搜!大厂猎头表示做上了直接给offer
  3. 收藏!架构师需要掌握的99条铁律
  4. Jeecg-Boot 2.1.2版本发布,基于SpringBoot的快速开发平台
  5. redis学习及实践3---Jedis、JedisPool、Jedis分布式实例介绍
  6. maven上传jar到私服
  7. 架构设计 | 高并发流量削峰,共享资源加锁机制
  8. 数据源管理 | OLAP查询引擎,ClickHouse集群化管理
  9. MySQL存储引擎:MyISAM InnoDB
  10. 第三周 day14:内置函数