1. 程式人生 > >出棧序列統計

出棧序列統計

ack 分享 urn 列操作 pop 所有 body mat ima

【問題背景】

今天是一個陽光明媚,風和日麗的好日子,豬爸爸和豬媽媽帶著佩奇和喬治去海灘玩耍。佩奇突發奇想,給喬治出了這麽一道題。

【問題描述】

棧是常用的一種數據結構,有n個元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩種:pushpop,前者是將一個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對於給定的n,計算並輸出由操作數序列12,…,n,經過一系列操作可能得到的輸出序列總數。

喬治才兩歲,沒法解決這麽難的問題。這時,你恰好從喬治身邊經過,於是他向你求助,請你幫助他解決這個問題。

【輸入】【輸出】

就一個數

n(1n1000) 一個數,即可能輸出序列的總數目。

【樣例】

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。

出棧序列統計