Catalan数的部分应用

  卡特兰数用于解决一些特定的排列问题,一般是求解有多少种排列。、

  Catalan数的定义:

  (1)当n=1时,C(1)=1。

  (2)当n>1时,C(n) = C(1)*C(n-1) + C(2)*C(n-2) + ... + C(n-1)*C(1)

  (3)当然,也可以这样算:

  (4)当然,还能这样算:  

  (5)更厉害的,是可以这样算,只是不大准而已:    (ps:这些都是经过证明的公式)

  注:所有的奇卡塔兰数(即n为奇数)Cn都满足

  一般来说,求卡特兰数有个基本问题,而其他问题一般可以转成这个问题。这个基本问题是这样的:一个n个bit的二进制数,如果其任意前缀都是1的个数>=0的个数,求这样的二进制有多少个?可以根据catellan数的性质直接求Cn即可。

经典题(1):有n对括号,请问n对括号能组成多少个合法序列?比如"(())"就是合法。

  思路:考虑前i个pre[i],可以这样认为,其中的左括号为1,右括号为0,那么就成功转成了卡特兰数的一般问题了。这里有个问题,编程之美中提到,f(2*n)=[1/(n+1)]*C(2*n,m),其实右式完全等于求Cn,也可以直接按Cn来求。但是为什么书里这么写呢?因为书中考虑的是枚举k为每个可能与首个左括号匹配的右括号的位置,假如规定括号序列的下标是从0开始的,由于k必须是奇数位置才合法,所以列出来的公式为 f(2n)=f(0)*f(2n-2)+f(2)*f(2n-4)+...f(2n-4)*f(2)+f(2n-2)*f(0),观察到式子中没有出现求奇数的f,因此直接将0~2n-1中的偶数映射过来就是1~n啦。

经典题(2):12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应列的第一排的人高,问排列方式有多少种?

  思路:先将12个人升序排序,下标分别为1~n。同样,用0代表首行,用1代表第二行。那么每个后缀back[i]中1的个数就必须大于等于0的个数了,否则肯定存在一个j>=i,首行[j]>次行[j],即第一行有个人比第二行高了,不合法。答案也是求Cn

经典题(3):将一个具有n个顶点的凸多边形切成多个三角形的方法有多少种?注意只能某一顶点切往另一顶点。

  思路:凸多边形的每条边必须对应一个三角形,那么现在的问题只是求这条边对应的另一个顶点在哪里。同样,这个顶点的位置也是枚举,那么就将问题分成了两个小问题,其实就是区间DP题。答案依然是Cn

经典题(4):有3个人要借书,3个人要还书。要使得3个人都能借到书,那么这6人进馆的序列有多少种?

  思路:将还书的人看成0,借书的人看成1。只能在有人还了之后才能有人借得到。那么每个前缀pre[i]中1的个数必须>=0的个数,又转成了一般问题。

  同样的问题还有:”合法的入栈出栈序列有多少种?“和”合法的找钱给钱序列有多少种“等等。

经典题(5):将一个具有n个顶点的凸多边形切成多个三角形的方法有多少种?注意只能某一顶点切往另一顶点。

  思路:凸多边形的每条边必须对应一个三角形,那么现在的问题只是求这条边对应的另一个顶点在哪里。同样,这个顶点的位置也是枚举,那么就将问题分成了两个小问题,其实就是区间DP题。答案依然是Cn

经典题(6):一个n*n的网格,要从左下角的格子走到右上角的格子,在不踏入对角线的情况下,且第一步必须往右走,有多少种方案到达终点?

  思路: 要不碰到对角线,那么往右走的次数要时刻多于等于往上走的次数。又是可以转成一般问题。

经典题(7):一个由n个节点组成的二叉树,不同构的有多少棵?

  思路:

经典题(8):矩阵连乘问题,n个矩阵相乘,要求为他们加括号改变乘法的顺序,有多少种方法?

  思路: 仍然是”合法的括号序列“的那道题。

时间: 2024-10-17 13:44:12

Catalan数的部分应用的相关文章

Catalan数

[问题描述]对于一个栈,已知元素的进栈序列,判断一个由栈中所有元素组成的排列的出栈序列. 有N个数,则代表入栈序列为1,2,3,4,5...,N.求所有可能的出栈序列和总数. 代码如下 #include<iostream> #include<vector> #include<algorithm> #include<string> #include<stdio.h> using namespace std; int N = -1; int sum

UVA 10312 - Expression Bracketing(数论+Catalan数)

题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Expression Bracketing 题意:有n个x,要求分括号,推断非二叉表达式的个数. 思路:二叉表达式的计算方法就等于是Catalan数的,那么仅仅要计算出总数,用总数减去二叉表达式个数.得到的就是非二叉表达式的个数. 那么计算方法是什么呢. 看题目中的图,对于n = 4的情况,能够分为这几种情况来讨论

UVA10303 - How Many Trees?(java大数+catalan数)

UVA10303 - How Many Trees?(java大数+catalan数) 题目链接 题目大意:给你1-N N个数,然后要求由这些数构成二叉搜索树,问有多少种这样的二叉搜索树. 解题思路:把前5项理出来,正好是1 2 5 14 42..就猜想是catalan数,结果也是对了.公式f(i + 1) = (4?i - 6)/ i; (i >= 2).结果很大,要用高精度. 代码: import java.util.*; import java.math.*; import java.io

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式. 首先 Catalan数 : 基本规律:1,2,5,14,42,132,.......... 典型例题: 1.多边形分割.一个多边形分为若干个三角形有多少种分法. C(n)=∑(i=2...n-1)C(i)*C(n-i+1) 2.排队问题:转化为n个人

【catalan数】10076 - 凸多边形分割

[catalan数]10076 - 凸多边形分割 Time Limit: 1000MS Memory Limit: 32768KB 这题不能用通项公式 我忘记了mod不支持除法 我忘记了mod不支持除法 1 # include<cstdio> 2 # include<iostream> 3 using namespace std; 4 const int maxn=250; 5 typedef unsigned long long LL; 6 LL f[maxn]; 7 int m

Catalan数——卡特兰数

一.Catalan数的定义 令h(0)=1,h(1)=1,Catalan数满足递归式:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0)  (n>=2) 该递推关系的解为:h(n) = C(2n,n)/(n+1),n=0,1,2,3,... (其中C(2n,n)表示2n个物品中取n个的组合数) 二.问题描述 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 问题分析: 我们先把这12个

HDU 4828 - Grids (Catalan数)

题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4828 Catalan数的公式为 C[n+1] = C[n] * (4 * n + 2) / (n + 2) 题目要求对M = 1e9+7 取模 利用乘法逆元将原式中除以(n+2)取模变为对(n+2)逆元的乘法取模 C[n+1] = C[n] * (4 * n + 2) * Pow(n+2, MOD-2) % MOD 其中Pow用快速幂解决 #include <cstdio> #include

关于Catalan数

问题的由来:编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种? 对问题的转化与思考:n 个元素进栈和出栈,总共要经历 n 次进栈和 n 次出栈.这就相当于对这 2n 步操作进行排列.问题等价于:n个1和n个0组成一2n位的2进制数,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少? 解答: 设P2n为这样所得的数的个数. 在2n位上填入n个1的方案数为 C(n 2n)不填1的其余n位自动填以数0.从C(n 2n)中减去不符合要求的方案数即为所求

POJ 2084 Catalan数

[题意]: 一个环上有2*N个连续的数,求将这些数两两连接且连接的边不相交的方法数. [知识点]: 数学+Catalan数 令h(1)=1,h(0)=1 递归式1:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2) 递归式2:h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为:h(n)=C(2n,n)/(n+1) (n=1,2,3,...) [题解]: Catalan数典型的应用,2*N的答案为h(N). [

(转载)Catalan数——卡特兰数

Catalan数--卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数) 问题描