令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)

  =h(n-1)*2(2n-1)/(n+1)

具体推导请百度,这里只需记得推导公式为h(n)=h(n-1)*2(2n-1)/(n+1)即可。

我们来说说这个的应用吧,从catalan数的定义递归定义可以看出,它是由自己 本身的一部分和n减去一部分 的和得到的,也就是说,有n个物品,1个物品进行操作1,n-1个不同任意排列物品进行操作2,即有h(0)*h(n-1)中方式;2个不同任意排列物品进行操作1,n-2个不同任意排列物品进行操作2,即有h(1)*h(n-2)种方式(乘法原理)……,然后问,n个物品有多少种方式使得不同物品进行不同种操作。根据乘法原理和加法原理,学过dp的很容易就能推导出卡特兰数的递归方程了。

应用:就如我上面所说。

例题:

1.括号化问题。
  矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

2.出栈次序问题。
  一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列? (h(n)种)
  类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

3.将多边行划分为三角形问题。
  将一个凸多边形区域分成三角形区域的方法数?
  类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
  类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

4.给顶节点组成二叉树的问题。
  给定N个节点,能构成多少种不同的二叉树?(能构成h(N)个)

下面是noip2003普及组的题目(噗。。我普及的题都不会。)

方法和上面的一样,直接O(n),这里注意,由于本题数据小,所以没事,到数据很大又没让取模。。那就高精吧。

#include <cstdio>
using namespace std; int main() {
int n, ans=1;
scanf("%d", &n);
for(int i=2; i<=n; ++i)
ans=ans*((i<<2)-2)/(i+1);
printf("%d\n", ans);
return 0;
}

Catalan数 && 【NOIP2003】出栈序列统计的更多相关文章

  1. vijos - P1122出栈序列统计 (卡特兰数)

    P1122出栈序列统计 未递交 标签:NOIP普及组2003[显示标签] 描写叙述 栈是经常使用的一种数据结构,有n令元素在栈顶端一側等待进栈,栈顶端还有一側是出栈序列. 你已经知道栈的操作有两·种: ...

  2. Catalan数与出栈顺序个数,Java编程模拟

    问题描述: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少?如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少? 分析:对于每一个数字i, ...

  3. SDUT 1266 出栈序列统计(卡特兰数)

    这道题是回溯算法,网上一查是卡特兰数先占上代码,题解过两天会写. #include <bits/stdc++.h> using namespace std; int main() { // ...

  4. 【转】【数据结构】【有n个元素依次进栈,则出栈序列有多少种】

    卡特兰数 大神解释:https://blog.csdn.net/akenseren/article/details/82149145      权侵删 原题 有一个容量足够大的栈,n个元素以一定的顺序 ...

  5. POJ1363 Rails 验证出栈序列问题

    题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ...

  6. 【NOJ2024】入栈序列和出栈序列

    入栈序列和出栈序列 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:293          测试通过:68 比赛描述 给出入栈序列 ...

  7. 牛客网剑指offer第21题——判断出栈序列是否是入栈序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  8. P1750 出栈序列

    这好像是普及难度的吧~ 感觉再次被小学生吊打了........ \(\color{Red}{----------------------=|(●'◡'●)|=我是手动的分割线------------- ...

  9. PAT线性结构_一元多项式求导、按给定步长反转链表、出栈序列存在性判断

    02-线性结构1. 一元多项式求导 (25) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过100 ...

随机推荐

  1. 每天一个linux命令day2【ss命令】

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...

  2. Java for LeetCode 061 Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given ...

  3. HDU 4059 容斥原理+快速幂+逆元

    E - The Boss on Mars Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  4. zsh(yum装包的时候,有时候会不行)

    [root@GIT ~]# yum search zsh =============================== N/S Matched: zsh ====================== ...

  5. Web性能测试中的几个关键指标

    系统吞吐量 吞吐量指单位时间内系统处理的请求数量,体现系统的整体处理能力.对于网站,可以用"请求数/秒"或是"页面数/秒"来衡量,也可以用"访问人数/ ...

  6. mysql中char,varchar与text类型的区别和选用

    关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... 于是去查阅了一 ...

  7. javascript栈的建立样码

    早上参加小孩的一年级入学前,看看相关的东东啦.. function Stack() { var items = []; this.push = function(element){ items.pus ...

  8. [译]ASP.NET 性能监控

    概述:在性能测试中性能监视器是非常强大的工具,本文主要简述了几个关键的计数器和相关的阈值. 监控性能计数器 很多的性能计数器在性能调优中是非常重要的,由于性能计数器太多,很多人不知道选择那些计数器. ...

  9. 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

    今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...

  10. WITH AS短语,也叫做子查询部分(subquery factoring)

    可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到. 作为提供数据的部分. 代码例子: with temp as (select ID, Type_Name, Type_ID ...