为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 9卡特兰数(蓝桥杯)

9卡特兰数(蓝桥杯)

2017-12-27 5页 doc 28KB 25阅读

用户头像

is_633808

暂无简介

举报
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卡特兰数(蓝桥杯)
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卡特兰数&#40;蓝桥杯&#41;】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索