卡特兰数讲义(陈朝晖)

合集下载

卡特兰数三个通项公式的推导

卡特兰数三个通项公式的推导

卡特兰数三个通项公式的推导前提条件:有两种操作,一种操作的次数不能超过另外一个,或者是不能有交集这些操作的合法方案数,通常是卡特兰数情景:1)n个0和n个1构成的字串,所有的前缀子串1的个数不超过0的个数,求这样的字串个数向上的操作不超过向右的操作2)包含n组括号的合法式子:与情景1的练习:左括号对于0,右括号对应13)一个栈的进栈序列为1,2,3,…,m,有多少个不同的出栈序列 ?4)n个节点可以构造多少个不同的二叉树。

5)在圆上选择2n个点,将这些点成对连接起来所得到的n条弦不相交的方法数6)通过连结顶点而将n+2边的凸多边形分成n个三角形的方案数形式:1 12 5 14 42 132 429 1430……推导:一式:曲线救国。

1.求总路径数2.求非法3.相减得到合法step1总路径就是2n次操作里选n次向右的方案数 C 2 n nC_{2n}^{n} C2nnstep2对于y = x + 1,所有的非法路径都必然与其有一个交点。

从第一个交点开始路径对于y = x + 1对称路径会对称到终点为(n-1,n+1)的点。

所以非法路径数就是 C 2 n n −1 C_{2n}^{n-1} C2nn−1step3二者相减:到达点 ( n , n ) 的合法路径数就是 H n = C2 n n − C 2 n n − 1 到达点(n,n)的合法路径数就是H_n=C_{2n}^{n} - C_{2n}^{n-1} 到达点(n,n)的合法路径数就是Hn=C2nn−C2nn−1二式:1.明确需要配凑的式子: 1 n + 1 2 n ! n ! n ! ,即 C 2 n n \frac{1}{n+1}\frac{2n!}{n!n!},即C_{2n}^{n} n+11n!n!2n!,即C2nn2.一式写成阶乘形式3.提公因式提这个公因式 2 n ! n ! ( n − 1 ) ! ,得到 2 n ! n ! ( n −1 ) ! ∗ ( 1 n − 1 n + 1 ) 提这个公因式\frac{2n!}{n!(n-1)!},得到\frac{2n!}{n!(n-1)!}*(\frac{1}{n}-\frac{1}{n+1}) 提这个公因式n!(n−1)!2n!,得到n!(n−1)!2n!∗(n1−n+11)4.通分括号内的式子,再把提取出的公因式与之相乘。

【转】卡特兰数四个公式(简单)

【转】卡特兰数四个公式(简单)

【转】卡特兰数四个公式(简单)
公式⼀
递归公式
h(0)=h(1)=1
h(n)=h(0)∗h(n−1)+h(1)∗h(n−2)+...+h(n−1)∗h(0)(n>=2)
如果我们⽤这个公式显然我们要使⽤递归算法,那么数据⼀⼤就在时空上很⿇烦
公式⼆
递推公式
h(n)=h(n−1)∗(4∗n−2)/(n+1)
这个公式应⽤递推,看上起⼗分和善
但对⼤数据呢?
我们注意到⼤数据的时候h(n)会很⼤,这时候题⽬⼀般会让你对某素数取模(当然你可以打⾼精度(划掉))
但你在取模过程中难保⼀个h(n)%mod=0
那么根据公式下⾯所有的数都会等于0,于是你就愉快的WA了
公式三
组合数公式1
h(n)=C(2n,n)/(n+1)(n=0,1,2,...)
卡特兰数可以与组合数联系起来,得到上⾯的公式
⽽组合数就是⼀个杨辉三⾓,可以递推得到(这个不属于这道题的讨论范围我假装你们都会(逃))
但我们发现对于⼤数据你要取模,⽽对于除法你是没办法⽤膜的性质的(当然你可以应⽤逆元(划掉)),所以造成了⿇烦
公式四
组合数公式2
h(n)=c(2n,n)−c(2n,n−1)(n=0,1,2,...)
与组合数公式1不同这个是两个组合数的减法
减法是可以⽤膜的性质的,于是你可以愉快的AC了。

滞后算子解卡特兰数

滞后算子解卡特兰数

滞后算子解卡特兰数1.引言1.1 概述概述:滞后算子和卡特兰数作为数学中的重要概念,在组合学、代数学、计算机科学、物理学等领域都有广泛的应用。

滞后算子是一种基本的线性代数运算符,它将数列中的每一项向后移动一位,并在首位添加一个给定的值。

而卡特兰数则是一系列极其重要且有趣的数列,描述了许多组合问题的解决方案的总数。

本文旨在探讨滞后算子是如何解卡特兰数的,并讨论其在组合问题中的应用。

我们将首先介绍滞后算子的概念和特点,包括其定义、运算规则以及具体的应用案例。

随后,我们将对卡特兰数的定义和性质进行详细阐述,包括其递推公式、递归关系和常见的数学性质。

在正文部分,我们将会详细介绍滞后算子解卡特兰数的方法和应用。

通过引入滞后算子,我们可以将卡特兰数的计算问题转化为代数问题,从而简化计算过程。

我们将会讨论不同的解决方法,并比较它们的优缺点。

此外,我们还将探讨滞后算子解卡特兰数在实际应用中的一些具体案例,例如计算树的种类、括号匹配问题等。

最后,我们将对滞后算子解卡特兰数的方法和结果进行分析和讨论。

通过比较不同的解决方案,我们可以评估其在不同情境下的适用性和效果。

同时,我们也将对滞后算子解卡特兰数的局限性进行探讨,并提出可能的改进方向。

通过本文的研究,我们希望能够深入理解滞后算子解卡特兰数的原理和应用,并且为相关领域的学术研究和实际应用提供一定的参考和借鉴。

1.2 文章结构文章结构部分的内容应包括文章的主要分节和各分节的主题或内容简介,以便读者在阅读前能够大致了解全文的结构和内容安排。

根据给出的文章目录,可以编写如下文章结构部分的内容:2. 正文2.1 滞后算子的概念和特点2.2 卡特兰数的定义和性质在本文的正文部分,我们将首先介绍滞后算子的概念和特点。

通过对滞后算子的详细解释,读者可以全面了解滞后算子的定义及其在问题求解中的作用。

接着,我们将介绍卡特兰数的定义和性质。

卡特兰数作为组合数学中的一个重要概念,具有许多重要的性质和应用,在各种问题中都有广泛的应用。

卡特兰数

卡特兰数

卡特兰数非常经典,很多现实的问题都是卡特兰数,如合法的入栈出栈序列有多少种就是卡特兰数,为什么呢?我们可以把0看成入栈操作,1看成出栈操作,即0的累计个数不小于1的排列有多少种。

还有很多其他的问题都是卡特兰数,如二叉树的个数,有序树的个数,多边形分成三角形的个数等。

卡特兰数的通项是c(2n, n)/(n+1)。

注意组合数学中的运算:A(m, n) = m! / (m-n)!, C(m, n) = A(m, n) / n! = m! / ((m-n)!*n!),因此卡特兰数的通项:C(2n, n)/(n+1) = (2n!) / ((2n - n)! * n!) / (n + 1) = (2n!) / (n! * n!) / (n + 1)卡特兰数的问题应用:1.圆周上有标号为1,2,3,4,……,2n的共计2n个点,这2n个点配对可连成n条弦,且这些弦两两不相交的方式数为卡特兰数C n2.游乐园门票1元一张,每人限购一张。

现在有10个小朋友排队购票,其中5个小朋友每人只有1元的钞票一张,另5个小朋友每人只有2元的钞票一张,售票员没有准备零钱。

问:有多少种排队方法,使售票员总能找的开零钱?3.甲乙两人比赛乒乓球,最后结果为20∶20,问比赛过程中甲始终领先乙的计分情形的种数。

即甲在得到1分到19分的过程中始终领先乙,其种数是卡特兰数4.饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个放进碗橱摞成一摞。

一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式?答:得数是第n个卡特兰数C n。

一个汽车队在狭窄的路面上行驶,不得超车,但可以进入一个死胡同去加油,然后再插队行驶,共有n辆汽车,问共有多少种不同的方式使得车队开出城去?1.括号化问题。

一个合法的表达式由()包围,()可以嵌套和连接,如(())()也是合法表达式;现在有6 对(),它们可以组成的合法表达式的个数为2.矩阵连乘:P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)3.出栈次序问题。

卡特兰数算法实现_解释说明以及概述

卡特兰数算法实现_解释说明以及概述

卡特兰数算法实现解释说明以及概述引言部分是文章的开篇,应该对卡特兰数算法进行简要的介绍和概述。

以下是引言部分内容:1. 引言1.1 概述卡特兰数算法是组合数学中一种重要的计算方法,用来计算大量具有递归关系的问题。

它由比利时数学家欧·乌亚伊斯于19世纪中叶首次提出,并以比利时数学家欧仁·查尔斯·卡特兰的名字命名而得名。

卡特兰数算法被广泛应用于多个领域,如计算机科学、信息技术、电子工程等。

它在组合优化、动态规划、几何图形等问题求解中发挥着重要的作用。

本文将详细介绍和解释卡特兰数算法的实现原理及其应用案例分析,并通过对比不同实现方法及其优劣,总结出适用于不同场景和问题求解的最佳实践。

1.2 文章结构本文共包括五个章节,每个章节都涵盖了不同方面的内容:- 第一章:引言。

本章介绍了本文的背景与目标,并简要概括了卡特兰数算法及其应用。

- 第二章:卡特兰数算法概述。

本章对卡特兰数算法进行定义和历史背景的介绍,并探讨了其在不同领域中的应用。

- 第三章:卡特兰数算法实现步骤。

本章详细解释了卡特兰数算法的具体实现步骤,包括递推公式推导、动态规划实现以及递归实现及优化方法。

- 第四章:卡特兰数算法应用案例分析。

本章通过具体案例分析了卡特兰数算法在括号匹配问题、栈操作序列计数问题和凸多边形三角剖分方案计算中的应用。

- 第五章:结论与总结。

本章总结了卡特兰数算法的优缺点,并展望了其未来的发展前景。

1.3 目的本文旨在深入研究和探索卡特兰数算法,全面解释其实现原理及其应用领域,并提供具体案例进行分析,以期读者能够更好地理解该算法并将其运用于问题求解过程中。

此外,本文也将为读者提供一些可行的优化方法和未来可能的发展趋势,为相关领域的研究人员和工程师提供参考和借鉴。

2. 卡特兰数算法概述2.1 定义和历史背景卡特兰数算法是一种用于计算排列组合数量的数学算法。

它以比利时数学家欧仁·查理·卡特兰(Eugène Charles Catalan)的名字命名,他首次研究并发现了这个数列。

9卡特兰数(蓝桥杯)

9卡特兰数(蓝桥杯)

9卡特兰数(蓝桥杯)卡特兰数⼜称卡塔兰数,英⽂名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, ...常规分析⾸先,我们设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)。

递归求解卡特兰数

递归求解卡特兰数

递归求解卡特兰数卡特兰数,又称卡塔兰数,是组合数学中一类重要的数列,其通项公式为C(n)=C(n-1)*2*(2n-1)/(n+1),其中n为正整数。

卡特兰数在组合数学、离散数学等领域被广泛应用,如二叉树的数量、括号匹配的方案数、山峰序列等问题。

本文将介绍一种递归求解卡特兰数的方法,以求解C(5)为例进行说明。

递归求解卡特兰数的基本思路是将问题拆分成若干个子问题,然后通过递归的方式进行求解。

具体来说,对于求解C(n),我们可以考虑先将其拆分成C(n-1)和C(n-2)两个子问题,然后通过递归求解这两个子问题,最终将它们的结果结合在一起得到C(n)的值。

下面是求解C(5)的具体步骤:Step1:求解C(4)根据卡特兰数的通项公式,C(4)=C(3)*2*7/5=14。

因此,我们需要先求解C(3)。

Step2:求解C(3)同理,C(3)=C(2)*2*5/4=5。

因此,我们需要先求解C(2)。

Step3:求解C(2)根据卡特兰数的通项公式,C(2)=C(1)*2*3/2=2。

因此,我们需要先求解C(1)。

Step4:求解C(1)C(1)=1,是卡特兰数的起始值。

Step5:结合子问题的结果求解C(2)根据递归的思路,我们已经求得C(1)的值,因此可以使用C(2)=C(1)*2*3/2=2的计算公式求解C(2)的值。

Step6:结合子问题的结果求解C(3)同理,我们已经求得C(2)的值,因此可以使用C(3)=C(2)*2*5/4=5的计算公式求解C(3)的值。

Step7:结合子问题的结果求解C(4)同理,我们已经求得C(3)的值,因此可以使用C(4)=C(3)*2*7/5=14的计算公式求解C(4)的值。

Step8:结合子问题的结果求解C(5)同理,我们已经求得C(4)的值,因此可以使用C(5)=C(4)*2*9/6=42的计算公式求解C(5)的值。

通过上述步骤,我们成功地使用递归的方法求解了C(5)的值,即C(5)=42。

卡特兰数

卡特兰数

卡特兰数什么是Catalan数说到Catalan数,就不得不提及Catalan序列,Catalan序列是一个整数序列,其通项公式是我们从中取出的就叫做第n个Catalan数,前几个Catalan数是:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, …咋看之下没什么特别的,但是Catalan数却是许多计数问题的最终形式。

Catalan数的一些性质Catalan数的基本公式就是上个部分所列出的那样,但是却有一些变形和具体的性质:1、这是根据原来的式子推导出来的,大概过程是这样的:2、这个递推式很容易可以从原来的式子中获得3、4、5、这个是Catalan数的增长趋势。

Catalan数在组合计算中的应用在《组合数学》(机械工业出版社)一书中,介绍Catalan数是由其一个应用推导出的公式,其具体的描述如下:n个+1和n个-1构成2n项,其部分和满足的序列个数等于第n个Catalan数。

其证明也不难,我们假设不满足条件的序列个数为,那么就有。

剩下的工作就是求了,我们假设有一个最小的k令。

由于这里k是最小的,所以必有,并且k是一个奇数。

此时我们将前k项中的+1变为-1,将-1变为+1,那么就得到一个有(n+1)个+1和(n-1)个-1的序列了,这样的序列个数就是我们要求的,数值大小为。

那么我们就得到了,就是我们前面的公式。

在具体的组合数问题中,很多都可以转换为Catalan数进行最后的计算,如下:1、如上文所说,对于任意的k,前k个元素中-1的个数小等于+1的个数的序列计数,我们可以不停地变换形式,比如将-1看成右括号,+1看成左括号,就变成了合法括号表达式的个数。

比如2个左括号和2个右括号组成的合法表达式有种,是()()和(())。

2、既然如上一点都把括号加上去了,那么顺便就再次转换,n+1个数连乘,乘法顺序有种,比如我们三个数连乘a*b*c,那么等于在式子上加括号,有2种乘法顺序,分别是(ab)c和a(bc)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

f (n)
1 n C2 n n 1
n 1 i 0
f (n) sum( Catalan i * Catalan n i )
n n 1 f (n) C 2 n C2 n
卡特兰数模型应用:
(1)二叉树的计数:已知二叉树有 n 个结点,求能构成多少种不同的二叉树 (2)括号化问题: 一个合法的表达式由()包围,()可以嵌套和连接,如:(())()也是合法表达式,现给出 n 对括号,求可以 组成的合法表达式的个数 (3)划分问题:将一个凸 n+2 多边形区域分成三角形区域的方法数 (4)出栈问题:一个栈的进栈序列为 1,2,3,..n,求不同的出栈序列有多少种 (5)路径问题:在 n*n 的方格地图中,从一个角到另外一个角,求不跨越对角线的路径数有多少种 (6)握手问题: 2n 个人均匀坐在一个圆桌边上,某个时刻所有人同时与另一个人握手,要求手之间不能交叉,求共有 多少种握手方法 接下来, 我们来讲讲有关卡特兰数, 也就是本题的具体处理。 首先, 我想到的是直接用计算机模拟栈的操作, 关于栈以及计算编程过程中用到递归、dfs(深度优先搜索)这些数学老师可能不太熟悉,直接跳过影响不大。
5
int n; void mul(int x); int main() { scanf("%d",&n); for(int i=n+2; i<=2*n; ++i){mul(i);} //高精度 ans[]乘单精度 i for(int i=2; i<=n; ++i){ //高精度 ans[]除以单精度 i int m=0,t; //m 之前产生的余数 for(int j=len; j>=0; --j){ t=m*10+ans[j]; ans[j]=t/i; m=t%i; } while(ans[len]==0){len--;} //高位去 0 操作 } for(int i=len; i>=0; --i) printf("%d",ans[i]); printf("\n"); return 0; } void mul(int x) { for(int i=0; i<=len; ++i) ans[i]*=x; for(int i=0; i<=len; ++i){ ans[i+1]+=ans[i]/10; ans[i]%=10; } while(ans[len+1]){ len++; ans[len+1]=ans[len]/10; ans[len]%=10; } } 上面的高精度其实还是过不了的,因为会超时,这里我们进一步考虑程序代码优化问题,必须对程序代码进 行优化处理才可以,前面卡特兰数整理之后的结果是: //t 为做除法的值
(向 x 或 y 方向走,走 m 步的方案数,图中我给的 m=7,另外杨辉三角我上课时也顺带图形解释一下) 2.组合公式: C (m, n) C (m 1, n) C (m, n 1) (到图中红点点方案数等于两个蓝点点的方案数和) 3.
C(m,0)+C(m,1)+C(m,2)+...+C(m,m)= 2 证明:
3
二、动态规划初步 编程最容易想到的就是动态规划,当我往格子里填数的时候,还没填完动态规划思想就产生了。 动态规划在处理问题过程中速度快的很大原因是,程序在运算过程中将我们处理的状态记录下来,并在此基 础上,直接一步到位推导出下一状态。因此,动态规划解题一般都具有较佳的时间复杂度。 但对于本题而言,一开数组我就发懵了 (n=60000) ,如果我将程序运行中各种状态都记录下来,数组得开 (60000*60000=3.6*109),你想这么做,但计算机内存空间绝对不允许啊! 下面代码我只通过了 n<20 小数据,原因是卡特兰数真他妈增长速度快,爆啦!因此,我们还得高精度处理! #include <iostream> #include <cstdio> #define N 610 using namespace std; long long a[N][N]; int n=19; int main() { for(int i=0; i<=n; ++i){ a[i][0]=1; a[0][i]=0; } for(int j=1; j<=n; ++j){ for(int i=j; i<=n; ++i){ a[i][j]=a[i][j-1]+a[i-1][j]; } } printf("%d\n",a[n][n]); } 三、滚动数组优化动态规划 下面我会了一种我提供的改良方案, 只记录与当前状态需要的前一种状态, 这里我采用滚动数组来节省空间。 #include <iostream> #include <cstdio> #define N 600010 using namespace std; long long a[2][N]={0}; int n,t=0; int main() {
2n *(2 n 1) *(2 n 2) *......*( n 2) n!
(我这里,给定是图形证明,总方案数-非法方案数即问题解,如上图所示)
6
五、高精度优化及数据压缩 我们不能傻傻的一直计算下去,还得继续分析啊,需要实现 1 秒内出现结果,你得降低计算处理数据量! 这时候数学老师最擅长啦,约掉相同的因子,降低计算量。对的,不仅如此,为了加快计算速度,在做高精 度数时同时对数据进行压缩。 (10 进制数据,你想多了,太烦了!计算机很忙的,这里我直接做成 109 进制数据, 如果再大就不可以了,相乘的结果 long long 存储不了的! ) 接下来,程序就可以秒过了! #include <bits/stdc++.h> #define ll long long #define N 60010 using namespace std; const ll M=1e9; ll a[N],sum[N<<1]; int n,len; void cnt(int m,int f); void mul(ll x); int main() { scanf("%d",&n); a[1]=1,len=1; //用来统计每个数据带来的质因子的总数量,因为是连乘,结果与各个质因子个数相关 for(int i=2; i<=n; ++i) cnt(n+i,1); //为了减少除法,这里通过直接减去分母中出现的相同质因子数量,完成除法操作 for(int i=2; i<=n; ++i) cnt(i,-1); //扫描一下可能的质因子分布区间,这里将所有的质因子按其数量进行逐个相乘,sum[i] for(int i=2; i<=2*n; ++i){ for(int j=1; j<=sum[i]; ++j){ mul(i); } } printf("%lld",a[len]); for(ll i=len-1; i; --i){ printf("%09lld",a[i]); } printf("\n"); return 0; } void cnt(int m, int f) //数据 m 可能会带来哪些质因子,f==1 用来累加质因子,否则用来去掉质因子 { for(int j=2; j*j<=m && m!=1; ++j){ while(m%j==0){ sum[j]+=f; m/=j; } } if(m) sum[m]+=f; }
卡特兰数讲义
——编程与数学两者间的关系
路桥中学 陈朝晖 130. 火车进出栈问题
一列火车 n 节车厢,依次编号为 1,2,3,…,n。 每节车厢有两种运动方式,进栈与出栈,问 n 节车厢出栈的可能排列方式有多少种。 输入格式 输入一个整数 n,代表火车的车厢数。 输出格式 输出一个整数 s 表示 n 节车厢出栈的可能排列方式数量。 数据范围 1≤n≤60000 输入样例: 3 输出样例: 5 一、了解卡特兰数 卡特兰数又称卡塔兰数,它是组合数学中一个常出现在各种计数问题中出现的数列,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ...... 有关这题的问题模型对我们数学老师而言,是再熟悉不过了。今天,我想借这题来和大家聊一下卡特兰数, 也了解一下编程与数学在解决问题时的关联。 关于卡特兰数公式有好多,我罗列几个了解的,其他公式不了解也没推导,数学老师应该非常熟悉。
类似问题 2:
一位大城市的律师在他住所以北 n 个街区和以东 n 个街区处工作,每天她走 2n 个街区去上班。如果他从不 穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路? 回到前面问题, 对于每一个数来说, 必须进栈一次、 出栈一次。 我们把进栈设为状态 ‘1’ , 出栈设为状态 ‘0’ 。 n 个数的所有状态对应 n 个 1 和 n 个 0 组成的 2n 位二进制数。由于等待入栈的操作数按照 1‥n 的顺序排列、入 栈的操作数 b 大于等于出栈的操作数 a(a≤b),因此输出序列的总数目=由左而右扫描由 n 个 1 和 n 个 0 组成的 2n 位二进制数,1 的累计数不小于 0 的累计数的方案种数。t i=0; i<=n; ++i) a[t][i]=1; for(int j=1; j<=n; ++j){ t=1-t; //用变量 t 来实现两个数组滚动 a[t][j-1]=0; //重新前面这个位置值 0,因为这个位置曾用过有数值在 for(int i=j; i<=n; ++i){ a[t][i]=a[1-t][i]+a[t][i-1]; printf("%lld ",a[t][i]); } printf("\n"); } return 0; } 四、高精度处理初步 上面想法真的很好,程序跑起来也快,但这一切都是假的!由于数据太大,你连数据都存储不了啊。当然这 些问题在数学老师眼里根本就不是问题,他们可以随意写出一个数,如:1/3,但计算机不同,得存储啊!你可 以想象一下 n=60000,算出来的数据得有多大啊! 事实上,数学老师根本就不可能计算得出来,因为学校文印室也不可能借那么多草稿纸给他们用,但我们可 以,甚至比这还要大的数据也可以算,还不出错,哈哈哈……! 接下来,我们重点来讨论高精度数据处理问题。 在做高精度数据处理之前,我们得给出我们需要计算得数据,如下,A 点到 B 点的卡特兰数整理之后的结果 是:
相关文档
最新文档