zoukankan      html  css  js  c++  java
  • 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)

      =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
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    C# Log4.Net日志组件的应用系列(二)
    C# Log4.Net日志组件的应用系列(一)
    使用TFS+GIT实现分布式项目管理
    动软代码生成器使用教程
    SVN使用教程
    windows系统重装流程
    使用纯真IP库获取用户端地理位置信息
    使用扩展方法重写.NET底层架构
    使用单例模式创建模型仓储层的唯一调用
    使用SQL Delta.v5.1.1.98.破解版同步数据结构
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3872642.html
Copyright © 2011-2022 走看看