卡特兰数

【C++题目】卡特兰数 卡塔兰数的定义: ⑴ 第 0 项为 1; ⑵ 第 1 项为 1; ⑶ 第 n 项的计算公式: Cn = C0×Cn-1 + C1×Cn-2 + C2×Cn-3 + … + Cn-1×C0 卡特兰数是从第0项开始,其前10项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862 问题:编写函数CTL,计算并输出卡特兰数的前 n 项(n>=3),每个数后面跟一个空格 提示:随着项数 n 的增加,卡特兰数会急剧增加,请适当地考虑长整型。 代码:(编写函数CTL,完善以下代码) 阅读详情

简介

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1, 1, 2, 5,14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845,35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020,91482563640, 343059613650, 1289904147324, 4861946401452, ...

原理

令h(0)=1,h(1)=1,catalan数满足递推式[1]  :

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

另类递推式[2]  :

h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的解为:

h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

递推关系的另类解为:

h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

应用

实质上都是递推等式的应用

括号化

矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)[3] 

出栈次序

一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?[4-5] 

常规分析

首先,我们设f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。ps.author.陶百百)

首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。

此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。

看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n)=C(2n,n)/(n+1)=c(2n,n)-c(2n,n-1)(n=0,1,2,……)。

最后,令f(0)=1,f(1)=1。

非常规分析

对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。

在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。

不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。

反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。

因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。

显然,不符合要求的方案数为c(2n,n+1)。由此得出输出序列的总数目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n)。

类似问题买票找零

有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

凸多边形三角划分

在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。

分析

如果纯粹从f(4)=2,f(5)=5,f(6)=14,……,f(n)=n慢慢去归纳,恐怕很难找到问题的递推式,我们必须从一般情况出发去找规律。

因为凸多边形的任意一条边必定属于某一个三角形,所以我们以某一条边为基准,以这条边的两个顶点为起点P1和终点Pn(P即Point),将该凸多边形的顶点依序标记为P1、P2、……、Pn,再在该凸多边形中找任意一个不属于这两个点的顶点Pk(2<=k<=n-1),来构成一个三角形,用这个三角形把一个凸多边形划分成两个凸多边形,其中一个凸多边形,是由P1,P2,……,Pk构成的凸k边形(顶点数即是边数),另一个凸多边形,是由Pk,Pk+1,……,Pn构成的凸n-k+1边形。

此时,我们若把Pk视为确定一点,那么根据乘法原理,f(n)的问题就等价于——凸k多边形的划分方案数乘以凸n-k+1多边形的划分方案数,即选择Pk这个顶点的f(n)=f(k)×f(n-k+1)。而k可以选2到n-1,所以再根据加法原理,将k取不同值的划分方案相加,得到的总方案数为:f(n)=f(2)f(n-2+1)+f(3)f(n-3+1)+……+f(n-1)f(2)。看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n-2)(n=2,3,4,……)。

最后,令f(2)=1,f(3)=1。

此处f(2)=1和f(3)=1的具体缘由须参考详尽的“卡特兰数”,也许可从凸四边形f(4)=f(2)f(3)+f(3)f(2)=2×f(2)f(3)倒推,四边形的划分方案不用规律推导都可以知道是2,那么2×f(2)f(3)=2,则f(2)f(3)=1,又f(2)和f(3)若存在的话一定是整数,则f(2)=1,f(3)=1。(因为我没研究过卡特兰数的由来,此处仅作刘抟羽的臆测)。

类似问题

一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

给定节点组成二叉搜索树

给定N个节点,能构成多少种不同的二叉搜索树?

(能构成h(N)个)

(这个公式的下标是从h(0)=1开始的)

n对括号正确匹配数目

给定n对括号,求括号正确配对的字符串数,例如:

1对括号:() 1种可能

2对括号:()() (()) 2种可能

3对括号:((())) ()(()) ()()() (())()(()()) 5种可能

那么问题来了,n对括号有多少种正确配对的可能呢?

实际上假设S(n)为n对括号的正确配对数目,那么有递推关系S(n)=S(1)S(n)+S(2)S(n-1)+...+S(n)S(1),显然S(n)是一个卡特兰数。

C++应用

void catalan() //求卡特兰数

{

    int i, j, len, carry, temp;

    a[1][0] = b[1] = 1;

    len = 1;

    for(i = 2; i <= 100; i++){

        for(j = 0; j < len; j++) //乘法

        a[i][j] = a[i-1][j]*(4*(i-1)+2);

        carry = 0;

        for(j = 0; j < len; j++) //处理相乘结果

        {

            temp = a[i][j] + carry;

            a[i][j] = temp % 10;

            carry = temp / 10;

        }

        while(carry) //进位处理

        {

            a[i][len++] = carry % 10;

            carry /= 10;

        }

        carry = 0;

        for(j = len-1; j >= 0; j--) //除法

        {

            temp = carry*10 + a[i][j];

            a[i][j] = temp/(i+1);

            carry = temp%(i+1);

        }

        while(!a[i][len-1]) //高位零处理

        len --;

        b[i] = len;

    }

}

 

从零开始:用君正T23ZN打造智能门锁双摄系统(含代码示例与调试技巧) 本文详细介绍了基于君正T23ZN视频处理芯片构建智能门锁双摄系统的完整实战方案。内容涵盖硬件选型与核心电路设计、软件开发环境搭建、双摄驱动框架、图像信号处理(ISP)调优、人脸识别算法集成与性能优化,以及系统调试与稳定性保障。文章提供了丰富的代码示例和调试技巧,旨在帮助嵌入式开发者高效实现具备人脸识别与监控功能的低功耗智能门锁视觉系统。 阅读详情

相关推荐

基于深度学习的时间序列预测

深度学习在时间序列数据中应用广泛,学术界已经有很多深度学习模型来适应不同领域的时间序列数据集的多样性。那么到底有哪些基于深度学习的时间序列预测模型?他们的优缺点是什么?让我们一起来看一下。

Sharon0408的博客 6580

合法出栈顺序 —— 卡特兰数

那么从(0,0)点到(n,n)点的过程中,我们总共需要向右移动n步,向上移动n步,一共2n步。凡超越主对角线都可视为触碰到y=x+1,在第一个触碰点处,关于y=x+1对称,我们会发现所有触碰到y=x+1的路径都会对称到(n-1,n+1)处,共C(n-1,n+1)种,另Catalan(卡特兰数)=C (n,2n)-C(n-1,n+1)=f(0)f(n-1)+f(1)f(n-2)+······+f(n-1)f(0);1,2,5,14,42······,我们发现,这与卡特兰数极为相似,那么何为卡特兰数?

m0_74227060的博客 1001

VMware16虚拟机:安装Windows10系统---超详细教程

VMware16虚拟机:安装Windows10系统---超详细教程

MQ0522的博客 3万+

【算法】卡特兰数问题(BST排列个数,矩阵乘法,算数加括号,排队等)

卡特兰数当年大二时候就知道了其在行走路线问题上面的应用,后来发现其还有更多的应用场景,而且最近做LeetCode也碰见了不少这样的问题,特此总结一番。 本篇未完,待续 96. Unique Binary Search Trees 95. Unique Binary Search Trees II 这两道题题干差不多,就是1~n总共n个数,将其构建成一个BST数,问总共有多少种不同的构建方法

haolexiao的专栏 3628

FPGA原型验证(八):SoC设计适配与实现策略

时钟门控在SoC设计中很常见,应该小心处理门控时钟,以成功地在FPGA上原型化SoC设计。现代FPGA综合工具在正确约束的情况下,可以自动处理大多数门控时钟。通过遵循本章中的指导方针,即使具有复杂时钟门控的SoC设计也可以得到处理,并成功地在FPGA上进行原型化。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 477

S32K324 Stack异常分析及解决方案

在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。该问题排查了好几天,最开始正向排查不出来,差点放弃了,ETAS OS也没有人支持,只能换一种思路,通过反向推,最终定位到问题,能完美解决,还是很欣慰的。遇到问题不可怕,Bug一直都会有,主要是在解决问题中的思路和方法,不断总结积累,总会越来越好的!

赞的博客 597

出栈序列卡特兰数

数据结构复习笔记 文章目录数据结构复习笔记一、卡特兰数 一、卡特兰数 n个不同元素进栈,出栈元素不同排列的个数为 f(n)=1n+1C2nnf(n) = \frac {1} {n+1}C^n_{2n}f(n)=n+11​C2nn​ 在此介绍两种理解 1、归纳法 f(1)=1 f(2)=2 f(3): 设入栈元素为a、b、c 若a第一个出栈,bc顺序相当于f(2) 若a第二个出栈,必为b入栈后出栈、a出栈,c入栈出栈,f(1) 若a第三个出栈,bc顺序相当于f(2) 故f(3)=f(2)+f(1)+f

qq_45677857的博客 2557

展锐平台wifi连接性问题解决方案

对于断开连接的问题,需要从kernel log中确认下,是上 层主动发起的断开(会下发disconnect的命令),还是CP侧上报的断开事件。同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。1、出现wifi连接正常,但无法上网问题,首先确认其他手机是否可以正常上网,排除网络自身问题;3 路由器配置问题,出现过一个案例,恢复出场设置问题就解决了,具体根因。

手机-手表蓝牙开发工程师的博客 2022

数据结构_任意N个元素有多少种出栈顺序(卡特兰数证明)

折现法——卡特兰数证明      1.饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个地放进碗橱摞成一摞。一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式? 2.给定n个数,有多少种出栈序列? 3.一个有n个1和n个-1组成的字串,且前k个数的和均不小于0,那这种字串的总数为多少?

cafuc46wingw的专栏 4001

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 1 2

本关任务:从文件user.txt中读取用户信息,包括账号、密码、联系方式等,创建一个用户信息的顺序表,根据账号判断顺序表中是否存在当前用户。如果存在,则添加失败。否则,判断输入的用户信息中是否有非法输入,若有则添加失败,否则将该用户作为新结点,按顺序插入到顺序表的相应位置,并将用户顺序表写入user.txt中。本关任务:从文件user.txt中读取用户信息,存入顺序表中。输入待查找的用户账号,调用折半查找算法判断用户顺序表中是否存在该用户的账号信息。如果存在,则返回其在顺序表中的位置,说明查找成功;

m0_62222486的博客 4934

AI Agent Harness Engineering 开发效率工具:Prompt工程、调试与监控平台

随着AI Agent技术从原型探索走向企业级落地,开发者普遍面临Prompt迭代无版本管控、Agent执行黑盒无法定位错误、上线后无监控导致故障频发、多团队协作效率低下四大核心痛点,据2024年LLMOps行业报告显示,没有配套工具链的Agent开发团队平均迭代周期是有工具链团队的6倍,线上故障率高达23%,平均资源浪费超过60%。

小白菜的博客 425

2014年第五届蓝桥杯C/C++程序设计本科B组决赛 出栈次序(结果填空)

出栈次序 X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。 路边有个死胡同,只能容一辆车通过,是临时的检查站,如图【p1.png】所示。 X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。 如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种? 为了方便起见,

A place to record sth. 4116

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

卡特兰数(Catalan)

什么是卡特兰数? 明安图数,又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现于各种计数问题中的数列。以中国蒙古族数学家明安图 (1692-1763)和比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, … 卡特兰数的几何意义 简单来说,卡特兰数就是一个有规律的数列,在坐标图中可以表示为:从原点(0,0)出发,每次向x轴或者y轴正方向移动1个单位,直到

2021dragon的博客 4万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【算法专题】卡特兰数

卡特兰数 1. 概述 卡特兰数:首先这个一个数,很多问题的结果都是卡特兰数,比如2016年全国三卷数学选择题压轴题让求解的就是卡特兰数,问题如下: 首先是结论:卡特兰数为: C2nnn+1 \frac{C_{2n} ^ n}{n+1} n+1C2nn​​ 因此,对于上面的题目,结果就是 C2mmm+1=C844+1=705=14 \frac{C_{2m} ^ m}{m+1} = \frac{C_8 ^ 4}{4+1} = \frac{70}{5} = 14 m+1C2mm​​=4+1C84​​

weixin_42638946的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Catalan(卡特兰)数

C(3):有3个节点,我们可以分别把 1 、 2、 3作为根节点(3种情况),当1作为根节点时,剩下2、3都比1大,全在右边,这时两个节点有两种二叉搜索树,也就是C(2)。以根节点1为例,C(0)表示左边没有节点,C(4)表示右边有4个节点,C(0)可以看成是一个特殊值,C(0) = 1。即:C(5) = C(0) * C(4) + C(1) * C(3) + C(2) * C(2) + C(3) * C(1) + C(4) * C(0)分别是(1,2)(2,1)。C(0)、 C(1) 已知,都为1。

qq_63748940的博客 1万+

浅析卡特兰数

主要讲了卡特兰数

gxzssyh的博客 3056

卡特兰(Catalan)数

参考:http://lanqi.org/skills/10939/ 卡特兰(Catalan)数来源于卡特兰解决凸n+2边形的剖分时得到的数列Cn,在数学竞赛、信息学竞赛、组合数学、计算机编程等方面都会有其不同侧面的介绍.卡特兰问题的解决过程应用了大量的映射方法,堪称计数的映射方法的典范。为了便于读者理解,我们先介绍一些卡特兰问题的简单变形,再介绍卡特兰问题及其解法。 问题一 进出栈 栈是一种先进后...

qq_30534935的博客 4658

什么是卡特兰数

#简介 卡特兰数是组合数学中一个常出现在各种计数问题中的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名。 数列的前几项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862,… 卡特兰数Cn满足以下递推关系: Cn+1 = C0Cn + C1Cn-1 + ··· + CnC0 ##原理 设h(n)为catalan数的第n+1项,令h(0)=1,h(1)=1,catalan数满足递推式: h(n)= h(0) * h(n-1) + h

weixin_44471490的博客 3584

卡特兰数详解

卡特兰数讲解

NEFU AB-IN's Blog 1733

C++卡特兰数讲解

C++卡特兰数的定义、公式、推导及应用典例。

2401_90042730的博客 2050

卡特兰数学习

卡特兰数(英语:Catalan number),又称卡塔兰数,明安图数。是。它在不同的计数问题中频繁出现。

2401_82677021的博客 3120

理解卡特兰数

(最开始一直搞不清楚卡特兰数到底是什么,公式也不知道是用来算什么的) 后来看懂卡特兰数是通过 求带限制条件的路径条数 这个典型例子,所以这次就从这个例子来说 (图片来源与维基百科) 问题:在n x n的网格里从左下角走到右上角的不经过y = x 这条线的单调路径的条数,即只能向上或向右走 如果没有限制条件,那么就是n步向上,n步向右,所以条数为 加上限制条件后,画图发现所有不合法的路...

喵喵喵 1万+

卡特兰数和超级卡特兰数

卡特兰数和超级卡特兰数 这篇博客主要是想讲一下超级卡特兰数(大施罗德数),顺带就想讲一下卡特兰数. 卡特兰数 定义 卡特兰数记为\(C_n\) \(C_1=1\) \(\forall n \geq 2, C_n=\sum_{i=1}^{n-1}C_i C_{n-i}\) 前几项大概是: 1, 1, 2, 5, 14, 42, 132...... 直接递推未免效率太低,我们考虑用生成函数优化. 显...

weixin_30496431的博客 268

卡特兰数汇总

本文讲解卡特兰数的各种递推公式,以及卡特兰数、卡特兰大数、卡特兰大数取模的代码实现,最后再顺带提一下卡特兰数的几个应用。 什么是卡特兰数呢?卡特兰数无非是一组有着某种规律的序列。重要的是它的应用。 卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845,...

nuoyanli的博客 2151
上一篇: 判断字符是否出现
下一篇: 最长上升子序列nlogn算法
流左沙
博客等级 码龄11年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值