zoukankan      html  css  js  c++  java
  • 【算法专题】卡特兰数(计数数列)

    Catalan数列:1 1 1 2 5 14 42 132 429 1430 4862 16796

    【计数映射思想】

    参考:卡特兰数 — 计数的映射方法的伟大胜利

    计数映射:将难以统计的数映射为另一种形式的可以统计的数。

    一、入栈出栈序

    n个数字,有多少种合法的入栈出栈序列?n=3时的合法序列之一:+1,-1,+1,+1,-1,-1

    对于n个数字,就是要在2n个1中添加n个“+”,则序列总数C(2n,n)。

    对于未入栈先出栈的不合法情况,在其第一次前缀和为-1时,将前面的所有符号反转,此时整个序列有n+1个“+‘和n-1个’-‘,每个不合法序列都映射为2n个1中添加n+1个'+'构成的序列。

    正向:每个不合法序列第一个前缀和为-1的位置反转后,形成的序列不同。

    反向:每个含n+1个"+"的序列,第一个前缀和为1的位置反转后,形成的不合法序列不同。

    所以得到卡特兰数:Cn=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)

    例一、含n+1个节点的满二叉树形态数:中序遍历,向左+1向右-1,转化为入栈出栈序。

    例二、圆上n个点连弦数:顺时针顺序每次+1和-1连弦,转化为入栈出栈序。

    例三、n对括号表达式:左括号+1右括号-1,括号表达式组合数转化为入栈出栈序。

    例四、n+1个数字连乘:结合n次即有n对有效括号,转化为括号表达式。

    例五、凸n+2边形的三角剖分数:对边进行编号,然后顺时针扫描,实际上是n+1条边的连乘方案,转化为入栈出栈序。

    二、不跨线路径数(几何模型)

    入栈出栈序:考虑n*n的方格,从左下到右上不跨越对角线的路径数,向右记为+1,向上记为-1,跨越对角线就是前缀和为-1,则转化为入栈出栈序。

    考虑n*m的方格,一条不合法路径在第一次跨越对角线的时候,将前面的路径翻转(上变左,左变上),那么就变成了到(n-1,m+1)的路径数。

    那么f(n,m)=C(n+m,n)-C(n+m,n-1)。

    【分治思想】

    一个问题A,规模为n,可以用分治的思想,先固定一个元素,然后将剩下n-1个元素拆分成两个问题,根据固定的元素位置不同,两个问题分别是(0,n-1)(1,n-2)...(n-1,0)。

    例一、入栈出栈序:固定最后出栈的数字是第k个加入的数,那么k前面是k-1个数的入栈出栈序问题,k后面是n-k个数的入栈出栈序问题,则有:

    C(n)=C(0)*C(n-1)+C(1)*C(n-2)+...+C(n-1)C(0),即C(n)=ΣC(i)*C(n-i-1),i=0~n-1,C(0)=1

    例二、凸n+2边形三角剖分数:先固定三角形V1VkVn+2,划分成凸k多边形和凸n+2-k边形,转化为Cn。

    ★总结:Catalan数的题目,一般从几种方式看出:转化为入栈出栈序,转化为几何不跨线路径数,定点分治思想,打表

  • 相关阅读:
    phrase(短语)
    AS3版MP3播放器核心
    内存回收机制
    检测FPS和内存占用
    NetConnection读取asp.net
    基于flash AS3.0 的BASE64编码与解码类
    as3访问WebService,SOAP协议
    六种角度看OCA与OCP、OCM区别
    ORACLE报表触发器
    ORACLE EBS常用表
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8213374.html
Copyright © 2011-2022 走看看