1 <?php 2 #給定入棧序列,求出棧序列組合總數 3 #這是一個catalan數問題 4 #設共有n個數入棧,將入棧序列和出棧序列寫在一起共有2n個數 5 #將第一個入棧的數作為基點,則第一個數肯定是在第2i+1的位置出棧 6 #否則第一個數入棧編號是0,如果是在2i,則在第一個數入棧和出棧之間共有2i-1個數,是奇數 7 #既然是奇數,則說明有數在第一個數出棧之前入棧卻沒有出棧,矛盾 8 #那麼,我們可以找到地推規律,設f(2n)表示n個數的入棧出棧序列總數 9 #則 f(2n) = f(0)f(2n-2) + f(2)f(2n-4) + ... + f(2n-2)f(0)10 #f(i)f(2n-i-2)表示位於第一個數入棧和出棧之間有i個數,第一個數出棧以後有2n-i+2個數11 #易知f(2) = 1, f(4) = 2 ...12 13 #n代表共有n個元素入棧14 function count_pop($n) {15 #如果只有一個或0個元素,則出棧序列只有一種16 if ($n <= 1) return 1;17 $sum = 0;18 for ($i = 0; $i < $n; $i++) {19 $sum += count_pop($i) * count_pop($n - 1 - $i); 20 }21 22 return $sum;23 }24 25 echo count_pop(4);26 27 #括弧配對問題28 #問n對括弧最多有多少種配對方法29 #例如2對括弧的配對方法有()(),(())共兩種30 #這也是一個catalan數列問題31 #以第一個做括弧為基點a,出現的位置為1,則下一個於這個括弧配對的肯定是2i+1,原理與上同32 #用f(n)表示共有n對括弧,那麼33 #f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)34 #其中f(i)f(n-1-i)表示第一對左右括弧之間共有i對括弧配對,第一對左右括弧右邊共有n-1-i對括弧配對35 #程式和上面一模一樣36 37 #再來就是劇院買票問題38 #有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票39 #劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零40 #將持5元買票的人視為左括弧,10元的人視為右括弧,問題解決41 42 #然後是n個節點,可以構成多少種不同形態的二叉樹,43 # 1 2 44 # / \ 和 / \ 算是形態相同45 # 2 3 1 346 # 1 2 47 # / \ 和 / 算是形態不同48 # 2 3 1 49 # /50 # 351 52 #同樣是catalan數問題,設f(n)為n個節點的樹形態53 #則f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)54 #f(i)f(n-1-i)表示當前樹的左子節點共有i個,右子節點共有n-i-1個55 #問題同上,解決56 ?>