[筆記]catalan卡特蘭數
前言:希望自己每個星期能發一篇文章,提升一下寫文章的能力?雖然對語文作文毫無幫助但是總比玩遊戲強
所以不務正業的東西就不放在首頁了,有興趣的可以點分類去看
來源: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卡特蘭數的更多相关文章
- [Apache] Apache 從 2.2 換至 2.4 httpd.conf 的調整筆記 (windows 環境)
原文地址: http://www.dotblogs.com.tw/maplenote/archive/2012/07/20/apache24_httpd_conf.aspx 整理一下 Windows ...
- Java學習筆記(基本語法)
本文件是以學習筆記的概念為基礎,用於自我的複習紀錄,不過也開放各位的概念指證.畢竟學習過程中難免會出現觀念錯誤的問題.也感謝各位的觀念指證. 安裝JDK 在Oracle網站中找自己系統的JDK下載位置 ...
- Gazebo機器人仿真學習探索筆記(二)基本使用說明
在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...
- [Python學習筆記] 使用xlwings 插入註解 (forked 版本)
到今天為止 xlwings 還沒有插入註解的功能 去原始開發者的 Github Pull Requests 他說之前有人有建議要加入這個功能 但他還沒更新~ 如果需要使用 Python 來插入註解的話 ...
- Dependency Injection 筆記 (3)
续上集.接着要来进一步了解的是 DI 的实现技术,也就是注入相依对象的方式.这里介绍的依赖注入方式,又称为「穷人的 DI」(poor man’s DI),因为这些用法都与特定 DI 工具无关,亦即不使 ...
- Dependency Injection 筆記 (2)
续上集,接着要说明如何运用 DI 来让刚才的范例程序具备执行时期切换实现类型的能力. (本文摘自電子書<.NET 依賴注入>) 入门范例—DI 版本 为了让 AuthenticationS ...
- Dependency Injection 筆記 (1)
<.NET 依賴注入>連載 (1) 本文从一个基本的问题开始,点出软件需求变动的常态,以说明为什么我们需要学习「依赖注入」(dependency injection:简称 DI)来改善设计 ...
- 筆記本 wifi走外网线 網卡走內網
筆記本 wifi走外网线 網卡走內網 ,案列 -------------------------------------------------------- route print ...
- FreeBSD 安裝 Tomcat JAVA JDK1.6 筆記
首先是安裝軟體 cd /usr/ports/java/jdk16/ make 在這一步,需要你手動到sun.com上下載幾個安裝包,按提示下載好後加入到 /usr/ports/distfiles/,再 ...
随机推荐
- Multi-lingual Support
Multi-lingual Support One problem with dealing with non-Latin characters programmatically is that, f ...
- 剑指Offer:树的子结构【26】
剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...
- POSTGRESQL主备部署模式
一.预期目的 主数据库(Primary pg ,假定主机名为A,后文不再赘述)和备用数据库(Standby pg,假定主机名为B,后文不再赘述)之间的数据能够相互备份. 主数据库发生故障时备用数据库可 ...
- margin在块元素、内联元素中的区别 padding
(1)margin在块元素.内联元素中的区别 HTML(这里说的是html标准,而不是xhtml)里分两种基本元素,即block和inline.顾名思义,block元素就是以”块”表现的元素(bloc ...
- [APIO 2015] 雅加达的摩天楼
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4070 [算法] 考虑将每个"Doge"向其所能到达的楼连边 直接 ...
- MTK USB 子系统
一.USB 子系统初始化 1. kernel/drivers/usb/core/usb.c subsys_initcall(usb_init); static int __init usb_init( ...
- php获取YouTube视频信息的方法
YouTube的视频地址格式https://www.youtube.com/watch?v=[VIDEO_ID]例子:https://www.youtube.com/watch?v=psvkyf3Pz ...
- HDU1083(最大匹配)
Courses Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- kafka之五:如何手动更新Kafka中某个Topic的偏移量
本文介绍如何手动跟新zookeeper中的偏移量.我们在使用kafka的过程中,有时候需要通过修改偏移量来进行重新消费.我们都知道offsets是记录在zookeeper中的,所以我们想修改offse ...
- Code:NFine目录
ylbtech-Code:NFine目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylb ...
