[筆記]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 ...
- Flask内置命令行工具—CLI
应用发现 flask命令在Flask库安装后可使用,使用前需要正确配置FLASK_APP环境变量以告知用户程序所在位置.不同平台设置方式有所不同. Unix Bash (Linux, Mac, etc ...
- 前端面试常考知识点---CSS
前端面试常考知识点---js 1.CSS3的新特性有哪些 点我查看 CSS3选择器 . CSS3边框与圆角 CSS3圆角border-radius:属性值由两个参数值构成: value1 / valu ...
- alsa 编程
ALSA(Advanced Linux Sound Architecture)是由内核驱动,标准的API库和一系列实用程序组成.因为涉及到版权和BUG的问题Linux 2.6内核抛弃了旧的OSS,AL ...
- ML assignment #1
ML assignment #1 Problem: implement classification model to train the Iris dataset and make predicti ...
- CNN卷积神经网络_深度残差网络 ResNet——解决神经网络过深反而引起误差增加的根本问题,Highway NetWork 则允许保留一定比例的原始输入 x。(这种思想在inception模型也有,例如卷积是concat并行,而不是串行)这样前面一层的信息,有一定比例可以不经过矩阵乘法和非线性变换,直接传输到下一层,仿佛一条信息高速公路,因此得名Highway Network
from:https://blog.csdn.net/diamonjoy_zone/article/details/70904212 环境:Win8.1 TensorFlow1.0.1 软件:Anac ...
- git bash的使用
一.创建本地版本控制仓库 cd e: 进入e盘 cd gitspace 进入gitspace文件夹 git init 将E:\gitspace初始化为本地版本控制仓库 Initialized em ...
- Messes in Reading Source Coding of SSD
这里记录在学习SSD源码过程中用到的相关内容 keras.applications.imagenet_utils.preprocess_input(): 用来将读入的原始图片张量转换成为需要Image ...
- boost replace_if replace_all_regex_copy用法
#include <boost/algorithm/string.hpp> // for is_any_of #include <boost/range/algorithm/repl ...
- 修改SO
1.如果在jni中定义的是int型的数据,比如: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, job ...