1. 程式人生 > >卡特蘭數--出棧佇列(解法收集和總結)

卡特蘭數--出棧佇列(解法收集和總結)

解法1:

可以把這個問題描述為一個二元組表示進棧出棧的狀態,(n, 0) 表示有n個元素等待進棧, 0 個元素已進棧,
這相當於問題最初的狀況. 接著問題轉化為(n-1,1). 
可以這麼說(n,0) = (n-1,1). 而對於(n-1,1)則相當於(n-1,0)+(n-2,2).
其中(n-1,0)表示棧中的一個元素出棧, (n-2, 2)表示又有一個元素入棧.也就是說,對於(n-1,1),已經有1個進棧的情況,這時候有兩種可能:①把棧裡面的這個元素出掉,②繼續把一個元素進棧,這兩種選擇導致的序列是不同的,這個是理解的難點和關鍵點.
這樣我們得到了轉化公式,把問題一般化,則(n,m)的排列問題可以轉化為(n,m-1)+(n-1,m+1) 


此時m>=1, 因為必須棧中有元素才可以出棧.
當m=0則(n,0)的問題只能轉化為(n-1,1). 
當問題為(0, m)時得到遞迴邊界,這個問題的解是隻有一種排列.
最終推導的結果是:P2n = C(n 2n)— C(n+1 2n)=C(n 2n)/(n+1)

這個結果是一個“卡塔蘭數”Catalan,在組合數學中有介紹,可以參閱有關資料.

結果=C(5,10)/6= 42

這個問題屬於卡特蘭數(h(n)=C(2n,n)/(n+1) (n=1,2,3,...))的應用,共有c(2n,n)-c(2n,n-1)=1/(n+1)*c(2n,n)中方式出棧。
對於每一個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態‘1’,出棧設為狀態‘0’。n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃描由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。
  在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃描,0的累計數大於1的累計數)的方案數即為所求。
  不符合要求的數的特徵是由左而右掃描時,必然在某一奇數位2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即一個不合要求的數對應於一個由n+1個0和n-1個1組成的排列。
  反過來,任何一個由n+1個0和n-1個1組成的2n位二進位制數,由於0的個數多2個,2n為偶數,故必在某一個奇數位上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應一個不符合要求的數。
因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。 顯然,不符合要求的方案數為c(2n,n+1)。由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)。
卡特蘭數變種問題:

相關推薦

--佇列解法收集總結

解法1: 可以把這個問題描述為一個二元組表示進棧出棧的狀態,(n, 0) 表示有n個元素等待進棧, 0 個元素已進棧,這相當於問題最初的狀況. 接著問題轉化為(n-1,1). 可以這麼說(n,0) = (n-1,1). 而對於(n-1,1)則相當於(n-1,0)+(n-

通項公式母函式,牛頓展開

組合意義非常顯然,經典的路徑問題。這裡主要討論母函式以及牛頓展開的證明。 考慮卡特蘭數的遞推式,發現這是一個卷積式 令 f (

n個數的方式

問題 給定n個數,有多少種出棧序列,進棧是按照順序進棧? 分析:當n為1時: f(1) = 1 //即 1 當n為2時: f(2) = 2;//12, 21 當n為3

| Catalan number

文章目錄 1.棧與卡特蘭數的關係 2.卡特蘭數 3.擴充套件 4.相關題目 1.棧與卡特蘭數的關係 棧是計算機中經典的資料結構,我們也會遇到一個常見的問題:一共有多少種合法的出棧順序? 先說一下什麼是合法的出棧序列, 凡是

洛谷P1044 :

https://www.luogu.org/problemnew/show/P1044 題目背景 棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。 棧有兩種最重要的操作,即pop(從棧頂彈出一個元素)和push(將一個元素進棧)。 棧的重要性不言自

簡單分析原理 為什麼可以求解情況 史上最簡單

首先簡單看一下公式 公式就是若要求一個數,就把之前求出來的數,第一個乘以最後一個。 為什麼可以這樣就可以求出出棧情況數呢? 我們用遞迴的思想來看待。 這裡我們作一個假設。我們會把n個數分成兩部分來處理。就是必須等第一部分處理(棧內全部排空)完後,第二部分的數才能入棧,才

n個元素進,輸出所有序列--遞迴

#include <iostream> #include <stack> #include <queue> #include <algorithm> #include <string.h> #include <

次序問題——

令h(0)=1,h(1)=1,catalan數滿足遞推式[1]: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2) 例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2 h(3)=h(0)*h(2)+h(

列車方案總數

出棧次序一個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?[5-6]常規分析首先,我們設f(n)=序列個數為n的出棧序列種數。(我們假定,最後出棧的元素為k,顯然,k取不同值時的情況是相互獨立的,也就是求出每種k最後出棧的情況數後可用加法原則,由於k最後

Catalan number

1.棧與卡特蘭數的關係 棧是計算機中經典的資料結構,我們也會遇到一個常見的問題:一共有多少種合法的出棧順序? 先說一下什麼是合法的出棧序列, 凡是合法序列都遵循以下規律:即對於出棧序列中的每一個數字,在它後面的、比它小的所有數字,一定是按遞減順序排列的。 例如

資料結構_任意N個元素有多少種順序(證明)

1.飯後,姐姐洗碗,妹妹把姐姐洗過的碗一個一個地放進碗櫥摞成一摞。一共有n個不同的碗,洗前也是摞成一摞的,也許因為小妹貪玩而使碗拿進碗櫥不及時,姐姐則把洗過的碗摞在旁邊,問:小妹摞起的碗有多少種可能的方式? 2.給定n個數,有多少種出棧序列? 3.一個有n個1和n個-1組成的字串,且前k個數的和均不小

---n 個元素順序入,則可能的序列有多少種

題目:N個數依次入棧,出棧順序有多少種? 首先介紹一下卡特蘭數:卡特蘭數前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35

應用--n個元素的順序與從(0,0)到(n,n)不穿過對角線的方法

1.出棧順序方法數: hdoj1023 求出棧序列,比如1,2,3,出棧序列為3 2 1,1 2 3,1 3 2,2 1 3,2 3 1,一共5種 第一種思路: 我們把入棧看做1,出棧看做0,那麼入棧

HDU 1134 Game of Connections

cut res ras sam eof cpp ont des tel 題目代號:HDU 1134 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 200

【專題】計數問題排列組合,容斥原理,

spl 狀態 ans 補集 方便 常用 括號 inf 不存在 ---下面都是學習的筆記,還沒有整理,比較淩亂,有需自取吧。--- 【排列組合】 <加法原理>做一件事情有n個方法,第i個方法有pi種方案,則一共有p1+p2+...+pn種方案。 <乘法原理&

【算法專題】計數數列

n-1 映射 點分治 blog -s 方法 .org div n-k Catalan數列:1 1 1 2 5 14 42 132 429 1430 4862 16796 【計數映射思想】 參考:卡特蘭數 — 計數的映射方法的偉大勝利 計數映射:將難以統計的數映射為另一種形式

N個節點的二叉樹有多少種形態

面試 誤區 樹的定義 節點 類型 基礎 更多 大於等於 證明 這是一道阿裏的面試題。其實算不上新鮮,但是我之前沒關註過,如今碰到了,就順便探討下這個問題吧:) 拿到這個題,首先想到的是直接寫出表達式肯定不行,所以有必要從遞推入手。由特殊到一般,歸納法麽~而且二叉樹離不開遞推

P1044 洛谷(數論)()

卡特蘭數 今天 name 出現問題 vector algo main cin n+1 卡特蘭數遞推公式之一(今天剛知道這東西…): f[n] = f[n-1] * (4 * n – 2) /(n + 1) (Ps:聽說在一些數據苛刻的題目中此公式會出現問題?不過對於這道題目

【HDU - 1134 】Game of ConnectionsJAVA大數加法,

題幹: This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, ... , 2n - 1, 2n consecutively in clockwise order on the

組合數——51nod 1120 機器人走方格 V3

51nod 1120 機器人走方格 V3 卡特蘭數介紹 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespac