前言:希望自己每個星期能發一篇文章,提升一下寫文章的能力?雖然對語文作文毫無幫助但是總比玩遊戲強

所以不務正業的東西就不放在首頁了,有興趣的可以點分類去看

來源:https://www.cnblogs.com/COLIN-LIGHTNING/p/8450053.html 以及書


1.遞推公式:

(1)一般:c [ n ]=Σ c [ k ] * c [ n-k-1 ],邊界為c[ 0 ]=1

其遞推解為c [ n ]=C( 2n,n ) / ( n+1 ),即通項公式,其中C表示組合數。

化簡得c [ n ]=2n*( 2n-1 ).....( n+2 ) / n!

(2)另類遞推式:c [ n ]=c[ n-1 ] * ( 4n-2 ) / ( n+1 ),邊界為c [ 0 ]=1

其遞推解為c [ n ]=C(2n,n)-C(2n,n-1)

(3)其他公式:c [ n ]=( Σ ( 0<=i<=n ) C( i,n )^2 ) / ( n+1 )

通過展開可發現它們的本質是一樣的。

2.這裡看一下它們的用處:(來自P1044 棧 題解)

(1)c [ n ]=Σ c [ k ] * c [ n-k-1 ]

在數據一大的情況下就比較麻煩

(2)c [ n ]=c[ n-1 ] * ( 4n-2 ) / ( n+1 )

對於大數據要mod一個數的時候,難保一個f [ n ]%mod=0

那麼根據公式下面所有的數都會等於0,非常的不好

(3)組合數公式1:c [ n ]=C( 2n,n ) / ( n+1 )

組合數是一個楊輝三角可以通過遞推得到,但是對大數據取膜模的時候並不滿足取模的性質的(但是可以用逆元?),所以也會比較麻煩

(4)組合數公式2:c [ n ]=C(2n,n)-C(2n,n-1)

與組合數公式1不同的是這是兩個組合數相減的形式,可以用模的性質,這樣就比較好

所以很多情況下我們可以用(4)的公式。

3.简单应用

(1)求解路径方案数:如图所示,从原点(0,0)到点B(n,n),只能向右或向上进行长度为一个单位的移动,路线一直处于y=x之下(不越过直线y=x)的不同路径方案数;

Solution:每个n的解都可以看做先前的解数(再向右向上即为所求)加上不触及各个y=x上的点到达B点的方案数,可以发现其递推公式即为卡特兰数计算公式;

(2)求01串的个数:n个0与n个1构成的序列方案数,使得任何一个前缀0的个数不少于1的个数;

Solution:将0看做在坐标系中向右走一步,1看做向上走一步,则问题可化简为从原点到(n,n)所有路线中一直处于y=x之下(不越过直线y=x)的不同路径方案数,与上题相同,方案数即为对应n的卡特兰数;

(3)给定节点求解二叉树的个数:已知由n个节点,求形成不同的二叉树有多少种?

Solution:将向左生成子树看做0,向右生成字数看成1,则问题化简为求n/2个0和n/2个1构成数串的不同方案数,即上题无条件解的一半,与上题答案相同,形成不同的树的个数即为对应n的卡特兰数;

(4)求凸边形进行三角剖分的不同方案数:在一个有n+3条边的凸多边形中,求通过若干条互不相交的对角线,把这个多边形划分成若干个三角形的不同方案数。

Solution:因为每一条边都一定是剖分后的三角形的一条边,任意一条边都会把多边形分成两个小多边形,那么根据乘法原理,解即为划分成不同多边形的方案数对应小多边形的划分方案数之和,即f[n]=Σ(3≤k≤n-3)f[k]f[n-k-1],可以发现解数即为n对应的卡特兰数;

(5)n对括号正确匹配数目:给定n对括号,求括号正确配对的字符串数;

Solution:因为是匹配问题,那么最后一个左括号必然有唯一右括号与其匹配,假设f[n]为n对括号的正确配对数目,那么有递推关系f[n]=f[0]f[n-1]+f[1]f[n-2]+...+f[n-1]f[0],显然f[n]是n对应的卡特兰数。

4.卡特兰数的扩展(折线原理)

对于在n位的2进制中,有m个0,其余为1的catalan数为:C(n,m)-C(n,m-1)。其可由应用(1)证明;

例題:

1.luogu P1044 棧

可以將n個數分成兩部分,一部分入棧出棧的方案數和另一部分的入棧出棧方案數滿足乘法原理,

也就是 f [ i ]=Σ f [ j ](前一部分)*f [ i-j-1 ](后一部分)(1<=i<=n,0<=j<i)

剛好是卡特蘭數,數據較小,公式(1)暴力遞推即可

也有二維動態規劃的解法,f [ i ] [ j ]表示 i 個在棧里,j 個在棧外,

每次兩種選擇:出棧或入棧 於是 f [ i ] [ j ]=f [ i-1 ] [ j ]+ f [ i ] [ j-1 ] 好像就是卡特蘭數的方法

邊界:f [ i ] [ 0 ]=1 ( 0<=i<=n )

2.luogu P1976 雞蛋餅

這里的圓和多邊形沒有什麼本質區別,所以和引用中的(4)一樣,直接求卡特蘭數即可

這個數據範圍仍然不大,所以還用公式(1)每次取膜就可以,注意乘的時候要轉longlong,會爆int

會繼續更新(有生之年)

[筆記]catalan卡特蘭數的更多相关文章

  1. [Apache] Apache 從 2.2 換至 2.4 httpd.conf 的調整筆記 (windows 環境)

    原文地址: http://www.dotblogs.com.tw/maplenote/archive/2012/07/20/apache24_httpd_conf.aspx 整理一下 Windows ...

  2. Java學習筆記(基本語法)

    本文件是以學習筆記的概念為基礎,用於自我的複習紀錄,不過也開放各位的概念指證.畢竟學習過程中難免會出現觀念錯誤的問題.也感謝各位的觀念指證. 安裝JDK 在Oracle網站中找自己系統的JDK下載位置 ...

  3. Gazebo機器人仿真學習探索筆記(二)基本使用說明

    在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...

  4. [Python學習筆記] 使用xlwings 插入註解 (forked 版本)

    到今天為止 xlwings 還沒有插入註解的功能 去原始開發者的 Github Pull Requests 他說之前有人有建議要加入這個功能 但他還沒更新~ 如果需要使用 Python 來插入註解的話 ...

  5. Dependency Injection 筆記 (3)

    续上集.接着要来进一步了解的是 DI 的实现技术,也就是注入相依对象的方式.这里介绍的依赖注入方式,又称为「穷人的 DI」(poor man’s DI),因为这些用法都与特定 DI 工具无关,亦即不使 ...

  6. Dependency Injection 筆記 (2)

    续上集,接着要说明如何运用 DI 来让刚才的范例程序具备执行时期切换实现类型的能力. (本文摘自電子書<.NET 依賴注入>) 入门范例—DI 版本 为了让 AuthenticationS ...

  7. Dependency Injection 筆記 (1)

    <.NET 依賴注入>連載 (1) 本文从一个基本的问题开始,点出软件需求变动的常态,以说明为什么我们需要学习「依赖注入」(dependency injection:简称 DI)来改善设计 ...

  8. 筆記本 wifi走外网线 網卡走內網

    筆記本 wifi走外网线  網卡走內網 ,案列 -------------------------------------------------------- route print        ...

  9. FreeBSD 安裝 Tomcat JAVA JDK1.6 筆記

    首先是安裝軟體 cd /usr/ports/java/jdk16/ make 在這一步,需要你手動到sun.com上下載幾個安裝包,按提示下載好後加入到 /usr/ports/distfiles/,再 ...

随机推荐

  1. 剑指Offer:反转链表【24】

    剑指Offer:反转链表[24] 题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题分析 这道题我才发现我是属于那种真的笨,图都画出来了流程写不出来.看了别人的代码,总觉得自己差一步. 这也 ...

  2. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

  3. CSU-1531 Jewelry Exhibition —— 二分图匹配(最小覆盖点)

    题目链接:https://vjudge.net/problem/CSU-1531 Input Output Sample Input 2 1 5 3 0.2 1.5 0.3 4.8 0.4 3.5 4 ...

  4. Spring源码-加载和IOC部分

    源代码和注释放在了github上,包括加载过程的注释和getBean部分的 地址: https://github.com/lvxingzhi/spring-framework-4.3.9-note.g ...

  5. noip2005篝火晚会

    这是一道不算太难的题,但愚蠢的我并没有想到. 首先,判断无解的情况:他想相邻的不想与他相邻. 然后,构造出合法的数列,因为第一位左边有两种选择,且构造出的环不等价,所以要做两次. (这一点我并没有想清 ...

  6. 浅谈如何删除JSP编译后的空行

    当你在客户端用view source看JSP生成的代码时,会发现有很多空行,他们是由< %...% >后的回车换行而生成的,也就是说每一行由< %...% >包含的JSP代码到 ...

  7. 使用Dubbo实现RPC调用

    启动Dubbo服务有2个方式,1是通过xml配置,2是通过注解来实现,这点和Spring相似. 采用XML配置如下: <?xml version="1.0" encoding ...

  8. 【C/C++】任意大于1的整数分解成素数因子乘积的形式

    // #include<stdio.h> #include<math.h> #include<malloc.h> int isprime(long n); void ...

  9. python 基础之第五天

    ###########window路径写法########## In [1]: winpath = 'C:\tmp' In [2]: print winpath C: mp In [3]: winpa ...

  10. 你忘记的java的数据类型信息

    java有8种基本数据类型 int long short byte float double char boolean: 三种情况造成数据溢出 无穷大,无穷小, NAN: 常量 声明为final的变量 ...