ACM演算法 組合數學

2021-10-08 23:08:07 字數 1629 閱讀 3805

卡特蘭數

問題: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 每個數等於它上...