zoukankan      html  css  js  c++  java
  • 对卡塔兰数的理解

    卡塔兰数定义

    f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)

          = f(k-1)f(n-k) k=1...n

    以k为轴划分子问题,左边子问题的解的个数和右边子问题的解的个数是原问题以k为轴的解法的2个独立步骤,适用乘法原理

    分别以1,2,。。。n为轴,是原问题的n种解法,适用加法原理。

    与卡塔兰数有关问题通常满足如下描述:有一个大问题A,规模为n,要解决这个问题,可以用分治的思想,首先固定其中某一个元素,将剩下的n-1个元素拆分成两个小问题,这两个小问题的规模分别是(0,n-1) (1,n-2) (2,n-3) ... (n-1,0)

    举几个例子:
    1. 二叉树计数,n个结点的二叉树,首先固定根节点,将剩下的n-1个结点拆分给左右子树
    2. 三角形划分问题,凸(n+2)边形可以划分为n个三角形,首先固定一条边(即一个三角形),这个三角形将这个(n+2)边形拆分成两个更小的多边形。

    有关卡塔兰数详细的数学证明,性质和应用,查阅维基百科卡塔兰数

    有关卡塔兰数的几何证明(折线),参考某博主的博客卡塔兰数

    下面是一个简单的卡塔兰数应用:

    就跟斐波那契数列一样,我们把n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为跟,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

    dp[2] =  dp[0] * dp[1]   (1为根的情况)

        + dp[1] * dp[0]    (2为根的情况)

    同理可写出 n = 3 的计算方法:

    dp[3] =  dp[0] * dp[2]   (1为根的情况)

        + dp[1] * dp[1]    (2为根的情况)

          + dp[2] * dp[0]    (3为根的情况)

  • 相关阅读:
    C51 使用端口 个人笔记
    C51 静态数码管 个人笔记
    C51 矩阵按键 个人笔记
    C51 蜂鸣器 个人笔记
    C51 独立按键 个人笔记
    C51 中断 个人笔记
    CC3200 TI 笔记
    iar修改包含路径的方法
    WCF绑定和行为在普通应用和SilverLight应用一些对比
    用批处理来自动化项目编译及部署(附Demo)
  • 原文地址:https://www.cnblogs.com/lidan-prime/p/9059631.html
Copyright © 2011-2022 走看看