zoukankan      html  css  js  c++  java
  • 斯特灵数与卡特兰数初步

    Ⅰ.第一类斯特林数

    问题描述:表示把n个人分成m组做环排列的方法数目。,求分成的(S(n,m))(方案数)。

    如:1,2,3,4 和 4,1,2,3 只算一种方案。

    (dp[i][j]=dp[i-1][j-1]+(i-1)*dp[i-1][j-1])

    (考虑第i个物品,i可以单独构成一个非空循环排列,这样前i-1种物品构成j-1个非空循环排列,方法数为dp[i-1][j-1])

    (也可以前i-1种物品构成j个非空循环排列,而第i个物品插入之前每个物品的左边,这有(i-1)*dp[i-1][j]种方法)

    Ⅱ.第二类斯特林数

    问题描述:表示把n个数分成无区别的k组,求分成的(S(n,m))(方案数)。

    (dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j) (前i个数分成j组)

    (当分到第i个数分为j组时,可以前i-1个数分成j-1组,自己单独一组,也就是dp[i-1][j-1])

    (也可以前i-1个数已经分成了j组,然后第i个数可以分到j组的任意一组,也就是dp[i-1][j]*j)

    当然,如果把n个数分成有区别的m组,方案数是(m!S(n,m)),这个自己感性理解一下。

    Ⅲ.卡特兰数

    (通项为f[n]=C_{2n}^n-C_{2n}^{n-1})

    在证明之前抛出一个问题:现在有长2n的01序列,0和1各有n个

    选0表示出栈,选1表示入栈,问有多少种合法的选择顺序(也就是在任意时刻1要大于等于0)。

    (我们把0,1操作扔到一个坐标系中。1看成向右上方走一步,0看成向右下角走一步,那么最后构造完后一定走到了(2n,0))

    (那么非法步骤就是经过了x=-1。由于从(0,0)出发经过x=-1最后到达(2n,0),根据对对称性质等价于)

    (从(0,-2)出发经过x=-1到达(2n,0),也就是在2n步中选n-1步往右下走,其余往右上走)

    所以,答案是(C_{2n}^n-C_{2n}^{n-1})

    卡特兰数习题1

  • 相关阅读:
    Java实现币值最大化问题
    Java实现币值最大化问题
    Java实现币值最大化问题
    Java实现币值最大化问题
    ddd
    雷军:小米最坏的时候已过去 2017目标营收千亿(确实有些新意)
    真正的转变从不确定中来
    很多人知道自己的斤两,他之所以抱怨工资低,不是觉得薪水和自己的能力不匹配,而是因为工资确实不够用(笑死了)
    CodeSmith
    sb2-admin
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12655696.html
Copyright © 2011-2022 走看看