棧是計算機中經典的資料結構,我們也會遇到乙個常見的問題:一共有多少種合法的出棧順序?
先說一下什麼是合法的出棧序列,凡是合法序列都遵循以下規律:即對於出棧序列中的每乙個數字,在它後面的、比它小的所有數字,一定是按遞減順序排列的。
例如:有數字1 2 3 4 依次入棧,那麼他們的出棧順序中:
所以到底有多少種合法序列呢?
答案就是:合法出棧數目==卡特蘭數f(0
)=1,
f(1)
=1f(0)= 1,f(1)= 1
f(0)=1
,f(1
)=1f(n
)=cn
2nn+
1=cn
2n−c
n−12
n(n=
0,1,
2,……
)f(n)= \frac_}= c^_n-c^_ (n=0,1,2,……)
f(n)=n
+1cn
2n
=cn2
n−c
n−12
n(n
=0,1
,2,…
…)公式②:
h (0
)=1,
h(1)
=1h(0)= 1,h(1)= 1
h(0)=1
,h(1
)=1h(n
)=h(
0)∗h
(n−1
)+h(
1)∗h
(n−2
)+..
.+h(
n−1)
∗h(0
)(n>=2
)h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
h(n)=h
(0)∗
h(n−
1)+h
(1)∗
h(n−
2)+.
..+h
(n−1
)∗h(
0)(n
>=2
)注意!!!
程式運算時使用第二種方法(第一種在n>15時就溢位了)
//方法一,m>15就溢位了
#include
using namespace std;
intmain()
for(
int i=
2;i<=m;i++
) cout<
(m+1
)<
return0;
}
//方法二
#include
using namespace std;
intmain()
; cin>>n;
f[0]
=1;f[1]=
1;for(
int i=
2;i<=n;i++
)for
(int j=
0;j) f[i]
+=f[j]
*f[i-j-1]
; cout<
;return0;
}
知道數量也要知道數量是怎麼出來的——動態規劃題目描述:棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。棧有兩種最重要的操作,即pop(從棧頂彈出乙個元素)和push(將乙個元素進棧)。
棧的重要性不言自明,任何一門資料結構的課程都會介紹棧。寧寧同學在複習棧的基本概念時,想到了乙個書上沒有講過的問題,而他自己無法給出答案,所以需要你的幫忙。
寧寧考慮的是這樣乙個問題:乙個運算元序列,從1,2,一直到n(圖示為1到3的情況),棧a的深度大於n。
現在可以進行兩種操作,
將乙個數,從運算元序列的頭端移到棧的頭端(對應資料結構棧的push操作)
將乙個數,從棧的頭端移到輸出序列的尾端(對應資料結構棧的pop操作)
使用這兩種操作,由乙個運算元序列就可以得到一系列的輸出序列,下圖所示為由1 2 3生成序列2 3 1的過程。(原始狀態如上圖所示)
你的程式將對給定的n,計算並輸出由運算元序列1,2,…,n經過操作可能得到的輸出序列的總數。
輸入:輸入檔案只含乙個整數n(1≤n≤18)
輸出:輸出檔案只有一行,即可能輸出序列的總數目
樣例輸入:
樣例輸出: 答案:#include
using namespace std;
intmain()
; cin>>n;
f[0]
=1;f[1]=
1;for(
int i=
2;i<=n;i++
)for
(int j=
0;j) f[i]
+=f[j]
*f[i-j-1]
; cout<
;return0;
}
卡特蘭數和超級卡特蘭數
這篇部落格主要是想講一下超級卡特蘭數 大施洛德數 順帶就想講一下卡特蘭數.卡特蘭數記為 c n c 1 1 forall n geq 2,c n sum c i c 前幾項大概是 1,1,2,5,14,42,132.直接遞推未免效率太低,我們考慮用生成函式優化.顯然有 c x c x 2 x 解得 ...
卡特蘭數,高精度卡特蘭數
簡單介紹 卡特蘭數是組合數學中常常出現的乙個數列。個人認為不管是遞推公式還是代表的含義都比斐波那契數列難理解一些。遞推公式 應用 1.cn表示長度2n的dyck word的個數。dyck word是乙個有n個x和n個y組成的字串。且全部的字首字串皆滿足x的個數大於等於y的個數。下面為長度為6的dyc...
棧 卡特蘭數 火車進出棧問題
傳送門 題意 一列火車n節車廂,依次編號為1,2,3,n。每節車廂有兩種運動方式,進棧與出棧,問n節車廂出棧的可能排列方式有多少種。資料範圍 1 n 60000 輸入樣例 3輸出樣例 5思路 進出棧問題 序列問題 路徑問題。這顯然是上一道火車進棧的公升級版,資料太大不能再進行遞迴處理了。問題轉換 尋...