元素進出棧問題的數學解析方法

2021-08-30 13:11:39 字數 3178 閱讀 2178

我們把n個元素的出棧個數的記為f(n), 那麼對於1,2,3, 我們很容易得出:

f(1) = 1     //即 1

f(2) = 2     //即 12、21

f(3) = 5     //即 123、132、213、321、231

然後我們來考慮f(4), 我們給4個元素編號為a,b,c,d, 那麼考慮:元素a只可能出現在1號位置,2號位置,3號位置和4號位置(很容易理解,一共就4個位置,比如abcd,元素a就在1號位置)。

分析:1) 如果元素a在1號位置,那麼只可能a進棧,馬上出棧,此時還剩元素b、c、d等待操作,就是子問題f(3);

2) 如果元素a在2號位置,那麼一定有乙個元素比a先出棧,即有f(1)種可能順序(只能是b),還剩c、d,即f(2),     根據乘法原理,一共的順序個數為f(1) * f(2);

3) 如果元素a在3號位置,那麼一定有兩個元素比1先出棧,即有f(2)種可能順序(只能是b、c),還剩d,即f(1),

根據乘法原理,一共的順序個數為f(2) * f(1);

4) 如果元素a在4號位置,那麼一定是a先進棧,最後出棧,那麼元素b、c、d的出棧順序即是此小問題的解,即f(3);

結合所有情況,即f(4) = f(3) + f(2) * f(1) + f(1) * f(2) + f(3);

為了規整化,我們定義f(0) = 1;於是f(4)可以重新寫為:

f(4) = f(0)*f(3) + f(1)*f(2) + f(2) * f(1) + f(3)*f(0)

然後我們推廣到n,推廣思路和n=4時完全一樣,於是我們可以得到:

f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0) 即

但這只是乙個遞推公式(若程式設計實現,需要維護乙個一維陣列,時間複雜度為o(n^2))。怎麼把它轉化為通項公式呢,複雜度僅為o(1)?

對於每乙個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。

在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。

不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位二進位制數,由於0的個數多2個,2n為偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。

顯然,不符合要求的方案數為c(2n,n+1)。

由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)。其中,n為節點的個數。

事實上,可以認為問題是,任意兩種操作,要求每種操作的總次數一樣,且進行第k次操作2前必須先進行至少k次操作1。我們假設乙個人在原點,操作1是此人沿右上角45°走乙個單位(乙個單位設為根號2,這樣他第一次進行操作1就剛好走到(1,1)點),操作2是此人沿右下角45°走乙個單位。第k次操作2前必須先進行至少k次操作1,就是說明所走出來的折線不能跨越x軸走到y=-1這條線上!在進行n次操作1和n此操作2後,此人必將到到達(2n,0)!若無跨越x軸的限制,折線的種數將為c(2n,n),即在2n次操作中選出n次作為操作1的方法數。

現在只要減去跨越了x軸的情況數。對於任意跨越x軸的情況,必有將與y=-1相交。找出第乙個與y=-1相交的點k,將k點以右的折線根據y=-1對稱(即操作1與操作2互換了)。可以發現終點最終都會從(2n,0)對稱到(2n,-2)。由於對稱總是能進行的,且是可逆的。我們可以得出所有跨越了x軸的折線總數是與從(0,0)到(2n,-2)的折線總數。而後者的操作2比操作1要多0-(-2)=2次。即操作1為n-1,操作2為n+1。總數為c(2n,n-1)。(此處類似於上面的數值角度分析)

令h(0)=1,h(1)=1,catalan數滿足遞推式[1]:

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)

例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

遞推關係的解為:

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)買票找零

有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)

(2)乙個有n個1和n個-1組成的字串,且前k個數的和均不小於0,那這種字串的總數為多少?

(3)飯後,姐姐洗碗,妹妹把姐姐洗過的碗乙個乙個地放進碗櫥摞成一摞。一共有n個不同的碗,洗前也是摞成一摞的,也許因為小妹貪玩而使碗拿進碗櫥不及時,姐姐則把洗過的碗摞在旁邊,問:小妹摞起的碗有多少種可能的方式?

最終結果:c(2n,n)-c(2n,n+1)

約瑟夫問題的數學方法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達 o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是 要讀者模擬整個過程。因此如果要追求效率,就要打破...

約瑟夫問題的數學方法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...

問題 J 小C的數學問題 單調棧

題目鏈結 題目描述 小c是個雲南中醫學院的大一新生,在某個星期二,他的高數老師扔給了他乙個問題。讓他在1天的時間內給出答案。但是小c不會這問題,現在他來請教你。請你幫他解決這個問題。有n個數,每個數有權值。數學老師定義了區間價值為區間和乘上區間內的最小值。現在要你找出有最大區間價值的區間是什麼,並輸...