Catalan数
先看2个问题:
问题一:
n个元素进栈(栈无穷大),进栈顺序为1,2,3,....n,那么有多少种出栈顺序?
先从简单的入手:
n=1,当然只有1种;
n=2,可以是1,2 也可以是2,1;那么有2种;
n=3,可以是1,2,3或1,3,2或2,1,3或2,3,1或3,2,1;一共5种;
容易联想到可能有一个通项公式可以求;
(扯一点,以前学栈的时候做过判断一个序列是否为合法的出栈顺序的题目,只要依次检查序列,对于一个元素i,在i后面出来的且序号比i小的肯定是从大到小出来的,比如 4 2 1 3,如果4都出来了,那么栈里从上到下只能是3 2 1)
通项公式的推导:
起先设F[i]表示i个元素进出栈(入栈的编号从小到大)的方案数;F[0]=1;F[1]=1;F[2]=2;F[3]=5;
对于F[n];假设编号为1的元素先入栈,在出栈,那么剩下n-1个元素,方案数就是F[1]*F[n-1];
假设编号为1和2的元素入栈出栈,有F[2]种方案,剩下n-2个元素,根据乘法原理方案数就是F[2]*F[n-2];
......
1,2,3,......n-1先入栈出栈......
相加就是总方案数
但是带入发现不对:其实这样枚举会漏解,因为这样枚举元素n永远都是最后一个出栈;
思路二:
假设元素1第一个出栈,剩下n-1个; 方案数就是F[0]*F[n-1];
假设元素1第二个出栈,剩下n-2个;1前面的1个元素出栈有F[1]种方案,后n-2个有F[n-2]种,根据乘法原理 方案数就是F[1]*F[n-2];
假设元素1第三个出栈,剩下n-3个;1前面的2个元素出栈有F[2]种方案,后n-3个有F[n-3]种,根据乘法原理 方案数就是F[2]*F[n-3];
......
假设元素1第n个出栈......
相加就是总方案数;
公式的话就是F[n]=F[k-1]*F[n-k](1<=K<=n);
问题2:
n个1和n个0组成一个2n位的二进制数;要求从左到右的1的累计数不少于0的累计数,求方案数。
假设有一个2n位的二进制数,从左到右某一位开始不满足条件,那么这一位前面的1和0一样多,所以这一位必定是奇数位。
设第2k+1位开始不满足条件,那么第2k+1位是0;前面2k+1位有k个1和k+1个0,剩下后面的(2n-2k-1)位有n-k个1和
n-k-1个0;如果把后面的(2n-2k-1)位中的n-k个1换成0,把n-k-1个0换成1;那么这个二进制数就变成了由n+1个0和n-1个1组成的二进制数;因此可知任意一个不符合要求的数都可以转化成一个由n+1个0和n-1个1组成的二进制数;
同理反过来 任意一个由n+1个0和n-1个1组成的二进制数都可以转化成一个不符合要求的数;证明:由于0比1多2个,必定在从某一个偶数位开始,0的个数比1多2个;同理把后面部分的01互换,就变成一个由n+1个0和n-1个1组成的二进制数;
所以总方案就等于 n个1和n个0组成一个2n位的二进制数的个数减去由n+1个0和n-1个1组成的二进制数的个数;
F[n]=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1);
由问题二 再来看 问题一:进栈的累计次数必定不少于出栈的累计次数,故
F[n]=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1);
也等于 F[k-1]*F[n-k](1<=K<=n)。这就是Catalan数(数学家Catalan在研究乘法结合律的时候提出,即求一个式子a1*a2*a3*a4*a5*......an一共有多少种添加括号的方法);
总结:像这种某两个元素的总个数相等,但其中一个的累计数不小于另一个的题目都可以用Catalan数的公式来解决;
相关练习:
1.2n个人排成一行买票,n个人只有10元整,n个人只有5元整,票价5元一张,问有多少种排队的方法,使得只要有带着10元的人买票,就有零钱可以找给他;
2.过河卒改编版,(图不好画,,结合过河卒的图吧)就是从左到右,n行n列,第一列只有从下到上1个 格子,第2列从下到上有2个,第n列有n个格子,从最左下角走到最右上角有多少种方案;
Catalan数的更多相关文章
- Catalan数应用整理
应用一: codevs 3112 二叉树计数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个有n个结点的二叉树总共有 ...
- 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】
Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...
- Catalan数(数论)
Catalan数 [参考网址]http://www.cnblogs.com/gongxijun/p/3232682.html 记得当时我们队写过一个,差点超时,现在找到了公式,感觉还是挺简单的. 还要 ...
- Catalan数 && 【NOIP2003】出栈序列统计
令h(1)=1, h(0)=1,catalan数满足递归式: h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2) =C(2n, n)/(n+1) ...
- catalan数及笔试面试里那些相关的问题(转)
一.catalan数由来和性质 1)由来 catalan数(卡塔兰数)取自组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项 ...
- Catalan数推导(转载)
Raney引理: 设整数序列A = {Ai, i=1, 2, …, N},且部分和Sk=A1+…+Ak,序列中所有的数字的和SN=1,在A的N个循环表示中,有且仅有一个序列B,满足B的任意部分和Si均 ...
- HDU 4828 - Grids (Catalan数)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4828 Catalan数的公式为 C[n+1] = C[n] * (4 * n + 2) / (n ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 12个高矮不同的人,排成两排(catalan数)
问题描述: 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 这个笔试题,很YD,因为把某个递归关系隐藏得很深. 问题分析: 我们先把这12个 ...
随机推荐
- fragment入门
[1]在activity布局中定义fragment <?xml version="1.0" encoding="utf-8"?> <Linea ...
- Date 与 switch的运用
<html><head><title>日期</title><script>function toChinese(day){ switch(d ...
- Objective-C与C++的区别
1.两者的最大相同:都是从C演化而来的面相对象语言,两者都兼容标准C语言 2.两者的最大不同:Objective-C提供了运行期动态绑定机制,而C++是编译静态绑定,并且通过嵌入类(多重继承)和虚函数 ...
- linux登录mysql
mysql -u 用户名 -p密码 mysql -u root -psqj888
- oracle中between
oracle中between and包含边界值,也就是所谓的闭区间. 如 between 1 and 100,则表示包含1和100及以内的一切数值. 如以下语句: 1 2 3 4 5 6 7 8 9 ...
- Html_页面的高度宽度等
offsetTop 指元素距离上方或上层控件的位置,整型,单位像素. offsetLeft 指元素距离左方或上层控件的位置,整型,单位像素. offsetWidth 指元素控件自身的宽度,整型,单位像 ...
- iOS 细碎知识整理
1centerX,即x轴的中点 centery,即y轴的中点
- Animation用法
测试代码及说明: <!DOCTYPE html> <html lang="en-US"> <head> <meta charset=&qu ...
- sql CHARINDEX函数
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置.CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start ...
- NodeJS 各websocket框架性能分析
For a current project at WhoScored, I needed to learn JavaScript, Node.js and WebSocket channel, aft ...