1. 程式人生 > >卡特蘭數應用--n個元素的出棧順序與從(0,0)到(n,n)不穿過對角線的方法數

卡特蘭數應用--n個元素的出棧順序與從(0,0)到(n,n)不穿過對角線的方法數

1.出棧順序方法數:

hdoj1023

求出棧序列,比如1,2,3,出棧序列為3 2 1,1 2 3,1 3 2,2 1 3,2 3 1,一共5種

第一種思路:

我們把入棧看做1,出棧看做0,那麼入棧出棧看做一系列的1010。。。,但是必須保證從左往右
看的時候1必須多餘0,這個是卡塔蘭數的第二個應用,種數為:C(n,2n)-C(n+1,2n).
粗略這樣理解:我們從2n個位置中選出n個來存放1,方法數為C(n,2n),減去不滿足的情況。
不合法的情況:我們在2n個位置放n+1個0,n-1個1,由於0的個數多2個,2n為偶數,故必在某一個奇數位上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應一個不符合要求的數,即C(n+1,2n)。

比如:對於數列10101001010100, 在第7個位置上首先出現了0比1多的情況,而在後面的數列中0的總計數還是比1的總計數多1(n+1個0, n-1個1)。如果把後面數列的0和1互換,那麼整個數列就能夠保證0和1的計數是相等的。同時對應了一種不符合要求的排列方法:10101000101011.

所以總的方案數為:h(n)=C(n,2n)-C(n+1,2n).

第二種思路:

這種方法直接來源於卡特蘭數3的遞推公式:h(n) = h(0) * h(n- 1) + h(1) * h(n - 2) + ... + h(n - 1) * h(0)

令f(n)為n個字元的出棧序列的方法數

假設在出棧序列中,在數1在第k個位置出棧,則之前有k-1個字元已經出棧,後面還有n-k個字元未出棧,那麼在這種情況下出棧方案數為f(k-1)*f(n-k), k = 1, 2, 3, ...,n

f(0) = 1, f(1) = 1

那麼f(n) = f(0) * f(n - 1) + f(1) * f(n - 2) + ... + f(n - 1) * f(0) = h(n)

第三種思路:

使用折現法,這種方法與從(0, 0)到座標(n ,n)不通過對角線的方法數有異曲同工之妙,具體見:http://blog.sina.com.cn/s/blog_6917f47301010cno.html

2.從(0,0)到(n,n)不穿過對角線的方法數

hdoj2067

給出一個棋盤n*n,求從左下角到右上角的不經過對角線的所有走法,這個經過分析也是卡特蘭數。我們把往右走看做1,把往上走看做0,那麼從左向右看做一系列的101100.。。,和那個求出棧序列的就是一個問題了,即0的個數不能超過1,由於上半形和下半形一樣,所以求出來卡特蘭數*2就是我們的答案了。

注:從(0,0)到(n, n)不接觸對角線上的點和從(0, 0)到(n, n)不穿過對角線上的點的方法數是不同的。後者可看作n個字元的出棧序列,前者可看作在先在棧中加入一個字元,之後在最後的操作之前棧底不能為空,所以方法數為h(n - 1)。

同樣可以使用對稱的方法求解:

對於不能接觸對角線的方法數的解法為:由於不接觸對角線,那麼第一步一定走向(1, 0), 倒數第二步的位置一定是(n, n - 1)。那麼總的方法數為:C(n - 1, 2n-2)。之後需要減去接觸對角線的方法數:如果我們從(0, 1)出發,到達(n, n -1)的路徑一定會接觸對角線,而這樣的路徑和從(1, 0)到(n, n -1)不合法的路徑是一一對應的的(可以把它從最後離開對角線的點到(1, 0)做一個關於y=x的對稱),那麼總的方法數為2 * (C(n- 1, 2n - 2) - C(n, 2n - 2)) = 2 * h(n - 1)種方法

對於可以接觸但不能穿過對角線的解法為:不能穿過y=x,等價與不能接觸y=x+1,所以,從(0, 0) 到(n, n)的總方法數為C(n, 2n),之後減去不符合要求的方法數。將(0, 0)關於y=x+1做對稱可得到點(-1, 1),從(-1, 1)到點(n, n)必定接觸y=x+1,方法數為C(2n - 1, 2n)。所以符合要求的方法數為:C(n, 2n) - C(2n - 1,2n) = C(n, 2n) - C(2n + 1,2n) = h(n)


這兩種問題通過卡特蘭數可以很容易地解決,可以看我轉的一篇文章:blog.csdn.net/u014097230/article/details/44244793