卡特蘭數
問題:n對括號有多少種合法的匹配方式?(卡特蘭數的常見應用之一)
結論:對於n對括號,合法的排列共有c(n,2n)-c(n+1,2n)
基本思路:
考慮n對括號,有n個(和n個),對於任意乙個)其前面必定有乙個(跟他對應,如果沒有則是非法序列。也就是說,對於),其前面的(的數量必須大於等於)的數量。假設(=1,)=-1。合法的序列是 1 -11 -1 1 -1,不合法的序列是1 -1 -1 1 1 -1。n對括號的全排列數為c(n,2n),減掉那些不合法的排列數就得到了合法的排列數,那麼不合法的排列數怎麼得到呢?觀察上面不合法的序列1 -1 -1 1 1 -1,從第3個數開始,)的個數比(大1,因此,後面的(的個數也會比)大1。我們把1到3的數翻轉一下,變成-1 1 1 1 1 -1,得到乙個有n+1個1,n-1個-1的序列。這樣的序列總共有c(n-1,2n)或者c(n+1,2n)種。
我們可以得出這樣乙個結論:對於所有有n+1個1,n-1個-1的序列,都存在乙個轉折點k,在k之前1的數量比-1的數量大1,在k之後1的數量比-1的數量大1。我們只需要從第1個到第k個元素翻轉回去,就能變成對於有n個1,n個-1的情況下的非法排列。因此我們可以得到非法排列的個數為c(n,2n)-c(n+1,2n)。
卡特蘭數公式
令h(0)=1,h(1)=1,catalan數滿足遞推式:h(n)= h(0)h(n-1)+h(1)h(n-2) + … +h(n-1)h(0) (n>=2)
另類遞推式[2]:h(n)=h(n-1)(4n-2)/(n+1);
遞推關係的解為:h(n)=c(2n,n)/(n+1) (n=0,1,2,…)
遞推關係的另類解為:h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…)
可以利用卡特蘭數解決的常見問題:
乙個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?
在nn的格仔中,只在下三角行走,每次橫或豎走一格,有多少中走法?
將乙個凸n+2邊形區域分成三角形區域的方法數?
圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?
有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?
卡塔蘭數**:
#include
#include
int a[
105]
[1000];
//大數運算
int b[
105]
;//儲存對應卡特蘭數有多少位
void
catalan()
//求卡特蘭數
while
(carry)
//進製處理
carry =0;
for(j = len-
1; j >=
0; j--
)//除法
while
(!a[i]
[len-1]
)//高位零處理
len --
; b[i]
= len;}}
intmain()
printf
("\n");
}}
組合數學 求組合數
對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...
數學 組合數學
mod must be a prime const int mod 1e9 7 namespace combinatory ll inv ll x ll fac maxn invfac maxn void initc int n ll a ll n,ll m ll c ll n,ll m ll d ...
組合數學筆記
從n個數中選m個數,每個數至多選一次,方案數 性質 c n,0 c n,n 1 c n,m c n,n m c n,m c n 1,m 1 c n 1,m 楊輝三角 二項式展開 x y n i 0.n c n,i x iy n i 那這裡先說一下楊輝三角 前提 每行端點與結尾的數為1 每個數等於它上...