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, 24466267...
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)。
看到此处,再看看卡特兰数的递推式,答案不言而喻,即为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。
类似问题 买票找零
有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零,(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的
数f(n)。[6]比如当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)f(3)=2,则f(2)f划分方案不用规律推导都可以知道是2,那么2×f(
(3)=1,又 f(2)和f(3)若存在的话一定是整数,则f(2)=1,f(3)=1。(因为我没研究过卡特兰数的由来,此处仅作刘抟羽的臆测)。
类似问题
一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路,
import java.util.*;
import java.math.BigInteger;
public class Catalan { //求卡特兰数
public static void main(String[] args){
int numberOfCatalan = 101; //
多少个卡特兰数
BigInteger[] digis = new BigInteger[numberOfCatalan];
digis = generateCatalan(numberOfCatalan);
Scanner scanner = new Scanner(System.in);
int number;
while(true) {
number = scanner.nextInt();
if(number == -1)
break;
String answer = digis[number].toString();
System.out.println(answer);
}
}
static BigInteger[] generateCatalan(int numberOfCatalan) {
//产生卡特兰数
BigInteger digis[] = new BigInteger[numberOfCatalan + 1];
BigInteger x = new BigInteger("1"); //第一个卡特兰数为1
digis[1] = x;
int y = 0;
int z = 0;
for(int counter = 2; counter <= numberOfCatalan; ++ counter)
{
y = 4 * counter - 2;
z = counter + 1;
digis[counter] = digis[counter-1].multiply(new BigInteger("" +
y));
digis[counter] = digis[counter].divide(new BigInteger(""
+ z));
}
return digis;
}
}
使用递归的方式解决卡特兰数
public static double CatalanNumber(int n) {
if (n == 1) {
return 1;
}
else {
return CatalanNumber(n - 1) * 2 * (2 * n - 1) / (n + 1);
}
}
public static void main(String[] args) {
for (int i = 1; i <= 50; i++) {
System.out.println(i + "'s Catalan Number is " + Catal
anNumber(i));
}
}
本文档为【9卡特兰数(蓝桥杯)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。