出棧序列計數問題
給定一長為n的序列,各位元素各不相同,那么經過入棧,出棧后,可以得到多少種不同的序列。
這個問題的答案是卡特蘭數C(n)。
卡特蘭數
卡特蘭數是中一個常在各種計數問題中出現的數列。用C(n)表示卡特蘭數第n項,則有通項公式
\[C(n)=C_{2n}^n-C_{2n}^{n+1}=\frac{C_{2n}^n}{n+1}=\frac{(2n)!}{(n+1)!n!} \]
有遞推公式
\[C(0)=1 \qquad and\qquad C(n+1)=\frac{2(2n+1)}{n+2}C(n) \]
證明
長為n的序列,每個元素需要入棧一次,出棧一次,以0表示入棧,1表示出棧。則出入棧操作可以由一個長為2n的01串唯一表示。這個01串需符合以下條件:
-
其中0與1的數量均為n。
-
對於任意位置i,[1,i]位置的子串中,出現的1的個數不大於0的個數(棧的性質,未入棧不可出棧)。
可以用容斥原理統計符合條件的01串。
首先易得符合條件1的01串個數為C(2n,n)。
其中不符合條件2的串一定有: 對於某個位置2i+1,[1,2i+1]出現的1的個數為i+1,0的個數為i。
又此串符合條件1,那么剩余位置的0,1個數分別為n-i,n-i-1。
如果將剩余位置的1變為0,0變為1。那么這個串就變成了一個由n-1個0,n+1個1組成的串。
設符合條件1但不符合條件2的串構成集合N,由n-1個0,n+1個1組成的01串構成集合M
由於01互換操作是一個一一映射函數,故M與N之間存在一個一一映射,故M,N元素個數相等(映射的性質)。
故卡特蘭數的通項公式為C(2n,n)-C(2n,n+1)。
這種思想稱為映射計數法。
一些可以用卡特蘭數的問題
-
從(0,0)到(n,n)的不越過直線y=x的非降路徑數
-
含n個節點的不同構的二叉樹的數量
-
凸n+2邊形分割為n個三角形的方法數
-
n對括號排列組成的合法的括號序列個數