1樓:硪丨曖戀
我們把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)即
n 個元素順序入棧,則可能的出棧序列有多少
2樓:悽清的小白鼠
我來補充吧,其實進棧出棧是可以同時進行的,並不一定要全部進去再出來,可以先進一部分再出來,所以關鍵是從那個開始先出
1.第一個先出的為d 則必須為dcba
2.第一個出來的是c則可為 cdba (abc依次進然後c出來d進去再出來然後ba出來) 也可為cbad (cb出來d進 、出,a出)也可為cbda 就是c之前的ab必須先b再a 因為是a先進而b是後進(注意是沒有出去)
3、同理第一個為b時可以為 bcda、bdca、bacd、badc、bcad(bdac是不行的因為要d排第二必須c進去而沒有出來也就是說c必須先a而出)
3樓:憑實陀雪
n個資料依次入棧,出棧順序種數的遞推公式如下:
f(n)=∑(f(n-1-k)*fk);其中k從0到n-1已知f0=1,
f1=f0*f0=1
f2=f1*f0+f0*f1=2
f3=f2*f0+f1*f1+f0*f2=5……證明的話,對於n個資料,我只看第一個資料的出入棧順序:
第一個資料入棧到出棧之間可以包含0,1,2…n-1個資料的出入棧,相應的,第一個資料出棧之後,還有n-1,n-2…2,1,0個資料需要出入棧
根據組合數學裡面的乘法原理,需要把第一個資料出棧前後的種數相乘根據加法原理,需要把第一個資料出入棧的n種方式全加起來於是就得到了那個遞推公式,不過,要找出一個直接計算fn的公式似乎不太好辦。
C語言 給定一陣列,包涵n個元素,設計功能函式,使用選擇排序
選擇排序演算法,按從小到大順序 void select sort int arr,int n 如果最小元素的下標不是後面n i 1的未排序序列的第一個元素,則需要交換第i個元素和後面找到的最小元素的位置 if k i c語言程式設計題 題目描述 使用氣泡排序法對陣列元素從小到大進行排序,要求輸出每一...
編寫程式將陣列的前n個元素中前端的m個元素和隨後的n m
for i 0 i間過程就抄是襲 這樣了,輸入輸出自己寫 應該很好懂。試用c程式實現將陣列a 的前n個元素和後m個元素進行位置交換的操作。教你一個好bai方法,我這沒裝vc6.0,就直接du口述給你吧!先 zhi建一個dao大小為m的陣列b n m 1 然後把後m個元素存內 到b陣列中,然後再容把前...
有幾種方法進電腦安全模式
windowsxp環境下進入安全模式 1 在計算機開啟bios載入完之後,迅速按下f8鍵,在出現的windowsxp高階選項選單中選擇 安全模式 2 如果有多系統引導,在選擇windowsxp啟動時,當按下回車鍵,就應該迅速地按下f8鍵 最好兩隻手進行操作 在出現的windowsxp高階選項選單中選...