出棧序列統計
阿新 • • 發佈:2018-03-04
ack 分享 urn 列操作 pop 所有 body mat ima n(1≤n≤1000)。 一個數,即可能輸出序列的總數目。
【問題背景】
今天是一個陽光明媚,風和日麗的好日子,豬爸爸和豬媽媽帶著佩奇和喬治去海灘玩耍。佩奇突發奇想,給喬治出了這麽一道題。
【問題描述】
棧是常用的一種數據結構,有n個元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩種:push和pop,前者是將一個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對於給定的n,計算並輸出由操作數序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。
喬治才兩歲,沒法解決這麽難的問題。這時,你恰好從喬治身邊經過,於是他向你求助,請你幫助他解決這個問題。
【輸入】【輸出】
就一個數
【樣例】
stack.in stack.out
3 5
【胡亂分析】
設a,b,c分別代表等待進棧元素個數,棧中元素個數,出棧元素個數。元素的總個數n=a+b+c。則c=n-a-b,所以,只要知道a和b的數值,就可以求出c。那麽對於這些元素來說,存在以下操作:①既進棧又出棧②只進棧不出棧③只出棧不進棧,那麽對於三種操作,等待進棧元素個數與棧中元素個數也會進行相應的變化。
.用f(a,b)表示從(a,b)變為(0,0)的所有移動方法。即f(n,0)。寫出以下遞歸式
邊界值:f(0,0)=1。
對於原題,起初有n個元素等待進棧,棧中有0個元素。即f(n,0)
代碼如下:
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 int n; 8 int f(int a,int b) 9 { 10 if(a == 0 && b == 0) 11 return 1; 12 else if(a > 0 && b > 0) 13 return f(a-1,b+1)+f(a,b-1); 14 else if(a > 0 && b == 0) 15 return f(a-1,b+1); 16 else if(a == 0) 17 return f(a,b-1); 18 } 19 int main() 20 { 21 scanf("%d",&n); 22 printf("%d",f(n,0)); 23 return 0; 24 }
end。
出棧序列統計