本題的描述十分簡單。n個數依次進棧,可隨機出棧。求有幾種可能。
解釋一下原理:建立陣列f。f[i]表示i個數的全部可能性。
f[0] = 1, f[1] = 1; //當然只有乙個
設 x 為當前出棧序列的最後乙個,則x有n種取值
由於x是最後乙個出棧的,所以可以將已經出棧的數分成兩部分
比x小的數有x-1個, 所以這些數的全部出棧可能為f[x-1]
比x大的數有n-x個,所以這些數的全部出棧可能為f[n-x]
這兩部分互相影響,所以乙個x的取值能夠得到的所有可能性為
f[x-1] * f[n-x]
兩部分不能互相混合,因為要降序排列,前面小的只有降完後才能插入後面大的數
可由乘法原理得到總數為相乘
另外,由於x有n個取值,所以
ans = f[0]*f[n-1] + f[1]*f[n-2] + … + f[n-1]*f[0];
這,就是傳說中的卡特蘭數
N個數順序進棧,出棧的情況
近日在複習資料結構,看到棧的時候,發現1個元素進棧,有1種出棧順序 2個元素進棧,有2種出棧順序 3個元素進棧,有5種出棧順序,那麼乙個很自然地問題就是n個元素進棧,共有多少種出棧順序?說來慚愧,以前學資料結構的時候竟然沒有考慮過這個問題。最近在看動態規劃,所以 子問題 這3個字一直在我腦中徘徊,於...
n個數順序入棧後的出棧順序
解法 遞推法 有n個位置,現在任意選定乙個數,比如1,那麼1可以在1 n的任意乙個位置上。假設1在第k的位置上,顯然在1的前面有k 1個數,並且這些數的數值為2 k,在1後面有n k個數。用f k 表示k個數順序入棧後的出棧順序,則f n 就是我們要求的最終答案。而f n 這個事件又可以分解成1在1...
輸入n個數和輸出調整後的b個數
問題及 方法 n個數往右移m格的步驟 把前n m個數逆序 最後m個數逆序 所有n個數逆序。檔名稱 a.cpp 作 者 單昕昕 完成日期 2016年4月19日 版 本 號 v1.0 問題描述 有n個整數,使前面各數順序向後移動m個位置,最後m個數變成最前m個數。程式輸入 資料個數n,n個資料 移動位置...