zoukankan      html  css  js  c++  java
  • 卡特兰数

         卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 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, ...——来自百度百科

      这并不是我第一次接触到卡特兰数,这些看起来毫无规律的数其实都有起源

          这里公式附上     

         令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)=h(n-1)*(4*n-2)/(n+1);

          递推关系的解为:

          h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

          递推关系的另类解为:

          h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

          关于卡特兰的应用,最概括的来讲就是统计出栈顺序的可能性,当然它的变形有很多很多,有一篇博文写的比较详细——http://blog.csdn.net/duanruibupt/article/details/6869431

          最后,是最近刚刚AC的一个题,权当例题了

    ================================================================================================

                                                                                               华丽丽的分割线

    ================================================================================================

    题目描述 Description

    竞赛班的师弟们都很懒,每个人都不喜欢倒垃圾,结果垃圾就会跟师兄的RP一样越堆越多,当然,老师时不时就会叫他们去倒垃圾。由于他们真的很懒,他们只会直接将垃圾桶最上面袋拿去扔。师弟们扔垃圾的时候,会先把垃圾装成袋,然后将垃圾编号,第一袋扔到垃圾桶的垃圾编为①号……掏垃圾的阿伯会清点一下编号的顺序,然后反馈给老师,让老师知道竞赛班高一师弟到底有多懒……【比如:当师弟们扔了3袋垃圾时,得到的编号有可能是123(每一袋扔进垃圾桶时他们就拿去扔,这个编号说明还是有人挺勤劳的),132(第一袋拿出去扔,然后垃圾桶里多扔了第2,3袋之后,他们再从上往下一袋一袋拿去扔)……】而竞赛班某师弟对阿伯倾慕已久,想知道阿伯最后收到的垃圾的顺序有多少种可能,由于他不好好学习科学文化知识,智商有点捉鸡,于是想让你帮他算出来,但你又觉得亲身实践简直蠢到爆,于是,你决定让计算机去做这件事。

    如果1s内计算机算不出,那少年,倒垃圾去吧,你太懒了……

    输入描述 Input Description

    只有一个整数n,表示师弟们总共扔了多少袋垃圾。

    输出描述 Output Description

    只有一个整数m,表示阿伯掏出垃圾的顺序的总可能结果。

    样例输入 Sample Input

    3

    样例输出 Sample Output

    5

    数据范围及提示 Data Size & Hint

    时间限制

    每个测试点1s

    数据范围

    对于50%的数据,1≤n≤15

    对于100%的数据,1≤n≤35

    Hint

    垃圾要按时倒啊,没听说过倒垃圾的男人最性感吗?【哪听来的这句话= =】……

        35袋垃圾……姚老叫你们不要在机房吃东西听到没有

    解题思路

    刚开始,我比较懒,用的是h(n)=h(n-1)(n*4-2)/(n+1) 这个公式,但就是有一个点不过

    后来我老老实实的敲了第一个公式,就过了。这是为什么呢?因为第二个公式中涉及乘法运算,先乘再除,很有可能会爆掉(什么?你说用实型边除边乘?精度不够)

    所以,第二个公式仅适用于n<=34

            第二个公式仅适用于n<=34

            第二个公式仅适用于n<=34

           (重要的事情说三遍)

     1 program tt;
     2 var h:array[0..35] of qword;
     3    n,i,j:Longint;
     4 begin
     5     read(n);
     6     h[0]:=1;
     7     h[1]:=1;
     8     for i:=2 to n do
     9     for j:=0 to i-1 do
    10     h[i]:=h[i]+h[j]*h[i-j-1];
    11     writeln(h[n]);
    12 end.
  • 相关阅读:
    合成反应
    poj 2229 Sumsets(dp)
    poj 2229 Sumsets(dp)
    Redis 笔记与总结3 list 类型
    大数据时代 企业要跟得上潮流
    大数据时代 企业要跟得上潮流
    企业用好大数据只需这6招
    企业用好大数据只需这6招
    企业大数据运用实战案例分享
    企业大数据运用实战案例分享
  • 原文地址:https://www.cnblogs.com/wuminyan/p/4741168.html
Copyright © 2011-2022 走看看