棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。
棧有兩種最重要的操作,即 pop(從棧頂彈出乙個元素)和 push(將乙個元素進棧)。
棧的重要性不言自明,任何一門資料結構的課程都會介紹棧。寧寧同學在複習棧的基本概念時,想到了乙個書上沒有講過的問題,而他自己無法給出答案,所以需要你的幫忙。
寧寧考慮的是這樣乙個問題:乙個運算元序列,1,2,…,n(圖示為 1 到 3 的情況),棧 a 的深度大於 n。
現在可以進行兩種操作,
1.將乙個數,從運算元序列的頭端移到棧的頭端(對應資料結構棧的 push 操作)
2.將乙個數,從棧的頭端移到輸出序列的尾端(對應資料結構棧的 pop 操作)
使用這兩種操作,由乙個運算元序列就可以得到一系列的輸出序列,下圖所示為由 1 2 3 生成序列 2 3 1 的過程。
(原始狀態如上圖所示)
你的程式將對給定的 n,計算並輸出由運算元序列 1,2,…,n 經過操作可能得到的輸出序列的總數。
輸入檔案只含乙個整數 n(1 ≤ n ≤ 18)。
輸出檔案只有一行,即可能輸出序列的總數目。
輸入樣例
輸出樣例這題用到了卡特蘭數,卡特蘭數的遞推公式為:
設第乙個出棧的序數為 x,則序數 x 就把 1~n 分成了兩個序列,分別為 1~x-1和 x+1~n,而它們的序列數分別為 x-1 和 n-x,所以對於在第乙個出棧的序數為 x 的情況下的所有可能性為 f[x-1]*f[n-x],所以,可以得到遞推式為:
f[0] = 1,f[1] = 1
f[n] = f[0]*f[n-1] + f[1]*f[n-2] + … +f[n-1]*f[0]
#include
using
namespace std;
intmain()
} cout<
<
return0;
}
遞推與遞迴
遞推與遞迴 遞推像是多公尺諾骨牌,遞迴是大事化小。遞推的效率更高 遞推 斐波那契數列 例 母親為兒子的四年大學學費準備了一筆存款,兒子每月月底取下月生活費1000元。銀行年利率為 1.71 畢業時連本帶息要取出 1000 元。則要存入多少錢。include define rate 0.0171 in...
遞推與遞迴
遞迴 將問題規模為n的問題,降解成若干個規模為n 1的問題,依次降解,直到問題規模可求,求出低階規模的解,代入高階問題中,直至求出規模為n的問題的解。遞推 構造低階的規模 如規模為i,一般i 0 的問題,並求出解,推導出問題規模為i 1的問題以及解,依次推到規模為n的問題。遞迴包括回溯和遞推兩個過程...
遞迴與遞推
1 遞迴與遞推的定義 前者是 後者是對以前的問題進行計算,以得出當前問題的大結果。2 它們的典例和運用遞迴 遞推dfs,搜尋與回溯 動態規劃 用遞推能做的,記憶化搜尋定能夠實現 遞推僅能求方案數,求具體方案需用遞迴 3 各種關於遞推的例題 爬樓梯 數樓梯 兔子問題 includeusing name...