zoukankan      html  css  js  c++  java
  • Catalan数总结

    最常用的两个式子:

    [Cat_{n}=frac{2n choose n}{n+1} ]

    [Cat_{n}={2n choose n} - {2n choose n-1} ]

    常见的问题形式

    1. n个左括号和n个右括号所能组成的合法序列数为(Cat_n)
    • 扩展:有n个左括号,n个右括号,恰有2m个括号失配的序列数为({2n choose n-m}-{2n choose n-m-1})
    1. 1,2,3,...n经过一个栈,能形成的合法出栈序列数为(Cat_n)

    2. n个节点构成的不同二叉树数量为(Cat_n)

    3. 在笛卡尔坐标系(平面直角坐标系)中从((0,0))走到((n,n)),只向上或向右走,不接触直线(x=y)的方案数,为(Cat_n)

    • 这也是Catalan数最常见的理解形式。常见的证明方法为对折法,即将一条非法路径碰触到直线(y=x+1)之后的部分沿该直线对折,最后终点为((n-1,n+1))。用合法路径数减去非法路径数即为所求答案。即({2n choose n} - {2n choose n-1})
    1. 不相交弦:在圆上选择2n个点,将这些点两两连接使所得的n条线段不相交的方案数。

    2. n个10元,n个5元,多少种方案使得用10元时一定有5元可供找零。

    一篇介绍Catalan数的博客

    以上只是列举了部分内容,Catalan数的形式远不止这些。

    例题

    题目描述

    出个题就好了.这就是出题人没有写题目背景的原因.
    你在平面直角坐标系上.
    你一开始位于((0,0))
    每次可以在上/下/左/右四个方向中选一个走一步.
    即:从((x,y))走到((x,y+1),(x,y-1),(x-1,y),(x+1,y))四个位置中的其中一个.
    允许你走的步数已经确定为(n)。现在你想走(n)步之后回到((0,0))。但这太简单了.你希望知道有多少种不同的方案能够使你在(n)步之后回到((0,0))。当且仅当两种方案至少有一步走的方向不同,这两种方案被认为是不同的.
    答案可能很大所以只需要输出答案对(10^9+7)取模后的结果。
    这还是太简单了,所以你给能够到达的格点加上了一些限制.一共有三种限制,加上没有限制的情况,一共有四种情况,用0,1,2,3标号:
    0.没有任何限制,可以到达坐标系上所有的点,即能到达的点集为{(x,y)|x,y为整数}
    1.只允许到达x轴非负半轴上的点.即能到达的点集为{(x,y)|x为非负数,y=0}
    2.只允许到达坐标轴上的点.即能到达的点集为{(x,y)|x=0或y=0}
    3.只允许到达x轴非负半轴上的点,y轴非负半轴上的点以及第1象限的点.即能到达的点集为{(x,y)|x>=0,y>=0}

    分析

    第一种情况:枚举左右(或上下)走的步数(0~n)(每次+2)。

    [ans = sum{{n choose i} imes {i choose {frac{i}{2}}} imes {n-i choose frac{{n-i}}{2}}} ]

    第二种情况:

    [ans = Cat(frac{n}{2}) ]

    第三种情况是个DP,就略过了。

    第四种情况:

    类比第一种情况,同样是枚举左右(上下)

    [ans = sum{{n choose i} imes Cat(frac{i}{2}) imes Cat(frac{n-i}{2}) } ]

  • 相关阅读:
    ES6学习笔记(五)函数的扩展
    ES6学习笔记(四)数值的扩展
    ES6学习笔记(二)变量的解构与赋值
    ES6学习笔记(一)新的变量定义命令let和const
    JS对象继承与原型链
    JS构造函数、对象工厂、原型模式
    获取地图的坐标
    大屏页面
    如何更新git?
    ES6——多个箭头函数
  • 原文地址:https://www.cnblogs.com/Zfio/p/catalan.html
Copyright © 2011-2022 走看看