1 5入棧順序有多少種可能出棧結果

2021-06-26 22:45:47 字數 2823 閱讀 7189

方法一、

a.  1個元素入棧出棧一種可能記作f(1) = 1;

b.  2個元素入棧出棧有兩種可能記f(2) = 2;

c. 3個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置2種,第三個位置f(2)種,記作f(3) = 5;

d. 4個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置(前面只有乙個元素pop出去了,在3個push任意位置插入乙個pop)有3種可能,第三個位置(說明已經pop出去兩個元素,考慮1-3三個數,pop其中兩個,若兩個連續有前面f(2)種,不連續只有一種,即num_pop(1,2) = 2,num_pop(2,3)=2,num_pop(1,3)=1)有共5種可能,第四個位置pop即為前面f(3)的值,即f(4) = 1 + 3 + 5 + 5 = 14種。

e. 5個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置(前面有4個元素選擇乙個pop)有4種可能,第三個位置(說明已有兩個元素pop出去,若為pop的為1,2有2種,1,3有一種,1,4有1種,若pop的為2,3有2種,pop2,4有1種,pop3,4有2種)共計9種,第四個位置(說明已經pop出去三個元素,那麼假設1未被pop,有f(3)種,2未被pop有f(2)種,3未被pop有f(2)種,4未被pop有f(3)種)共14種,第五個位置即f(4),因此f(5) = 1 + 4 + 9 + 14 + 14 = 42種。

方法二、

a.  f(4) = |push| x | x | x | x | x | x |pop|

b. f(5) = |push|pop| f(4) | + |push| push | x | x | x | x | x | x | x | pop |

顯然 |push| push | x | x | x | x | x | x | x | pop | > f(4) ,由於對應於第乙個x可以是pop,可以有pop多乙個在前。

設為:|push|push| x1 | x2 | x3 | x4 | x5 | x6 | x7 |pop|

x1乙個pop不能讓其產生消除第乙個push

x2x1同時為pop時候,後面還有6個數即f(3) = 5種

x3消除第乙個push是不可能的,不用考慮

x4和x1,x2,x3中兩個個組合pop可以消除第乙個push(但x1,x2同為pop不考慮)即有c(3)(2) - 1 = 2 種可能,而右邊有4個空缺,有f(2) = 2種,綜合考慮有2*2 = 4 種。

x5消除第乙個push是不可能的,不用考慮

x6消除第乙個push,若x5為push,那麼必然不成立。因此x1-x4排列2push,2pop,有c(4)(2) - 1 = 5種,而對於後者只有x7只有push一種可能,綜合考慮有5*1 = 5種

x7消除第乙個push,不可能。

因此,f(5) = f(4) + f(4) + 5 + 4 + 5 = 14 * 3 = 42

方法三、

卡特蘭數 h(n)=h(n-1)*(4*n-2)/(n+1) = c(2n,n)/(n+1)  = c(2n,n)-c(2n,n+1) 將5代入 直接得到答案42

證明:1. 假設1~n的元素,中第i個元素最後出棧,那麼在i之前的元素都在i入棧前已經完成了出棧,即有f(i-1)種。所有i之後的元素在i入棧後,先後完成了入棧和出棧,有f(n-i)種。

令f(0) = 1,那麼有; f(n) = f(0)*f(n-1) + f(1)*f(n-2)……f(n-1)*f(0) 

2. 用0,1分別表示出棧和入棧,那麼1~5的入棧出棧操作可以用10位01bit位來模擬,但需要保證從左邊到右邊掃瞄過程中,1個個數總是大於或等於0的個數。

假設採用列舉的方法,即c(2n,n)種,有哪些不符合要求?

假設某個偶數字2m,產生了衝突,前面0的個數超出1個個數,顯然2m位是0,那麼必須有2m-1位剛好匹配完所有的push,即1,0對等。顯然奇數不可能實現這個,一次不可能在偶數字衝突。

假設某個奇數字2m+1產生衝突,那麼前2m位剛好匹配,2m+1位是0,然後後面有n-m-1個0,n-m個1,,將後面的資料都對應反向,即n-m個0,n-m-1個1,仍不影響該結果不可能是合理解,在n-m+m+1 = n+1個0,n-1個1產生的組合包含n個0,n個1產生的不合理解。

n-1個1,n+1個0,組合成2n個bit的列,在某一位上0的個數會超過1的個數,假設這個位是偶數字,顯然不可能,若為奇數為,設為2*x + 1,將後面資料都反向對應有n-x-1個0,n-x個1,完全也不影響這個列成為不符合要求的列,即有n-1個1,n+1個0組合不合理情況包含n個0,n個1產生的不合理解。

即n-1個1,n+1個0,產生的不合理解即為全部不合理解。

因此h(n) = c(2n,n) - c(2n,n+1);

方法四、

**解決:

少量資料可以直接10位bit,每次+1,判斷是否有5個1,判斷是否從左到右邊遍歷總是1個數不小於0個數,符合即可輸出結果。

也可以初始化5個1,5個0,然後在這個集合中next_permutation,求所有集合,然後對每種組合進行判斷,**如下。

N個數依次入棧,出棧順序有多少種?

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

N個數依次入棧,出棧順序有多少種?

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

N個數依次入棧,出棧順序有多少種?

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