1. 程式人生 > >棧和卡特蘭數(Catalan number)

棧和卡特蘭數(Catalan number)

1.棧與卡特蘭數的關係

棧是計算機中經典的資料結構,我們也會遇到一個常見的問題:一共有多少種合法的出棧順序?

先說一下什麼是合法的出棧序列, 凡是合法序列都遵循以下規律:即對於出棧序列中的每一個數字,在它後面的、比它小的所有數字,一定是按遞減順序排列的。
例如:有數字1 2 3 4 依次入棧,那麼他們的出棧順序中:

  • 4321合法:4後面比它小的數是321,並且321遞減;3後面比它小的是21,並且21遞減。
  • 3421合法:3後面比它小的是21,並且21遞減;4後面比它小的是21,並且21遞減。
  • 1423不合法:4後面比它小的是23,23不是遞減。

所以到底有多少種合法序列呢?
答案就是:合法出棧數目==卡特蘭數

2.卡特蘭數

卡特蘭數又稱卡塔蘭數,卡特蘭數是組合數學中一個常出現在各種計數問題中的數列。以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名。(卡特蘭數百度百科
公式①:
f0=1f1=1f(0)= 1,f(1)= 1
fn=Cn2nn+1=cn2ncn12nn=012f(n)= \frac{C^{2n}_{n}}{n+1}= c^{2n}_n-c^{2n}_{n-1} (n=0,1,2,……)
公式②:
h0=1h1=1h(0)= 1,h(1)= 1


h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)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<iostream>
using namespace std;
int main()
{
	int m;
cin>>m; long long int result=1; for(int i=m+1;i<=m*2;i++) { result*=i; } for(int i=2;i<=m;i++) { result/=i; } cout<<result/(m+1)<<endl; return 0; }
//方法二
#include <iostream>
using namespace std;
int main()
{
    int n,f[20]={0};
    cin>>n;
    f[0]=1;f[1]=1;
    for(int i=2;i<=n;i++)
       for(int j=0;j<i;j++)
          f[i]+=f[j]*f[i-j-1];
          cout<<f[n];
    return 0;
}

3.擴充套件

知道數量也要知道數量是怎麼出來的——動態規劃

4.相關題目

題目描述:
棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。棧有兩種最重要的操作,即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)
輸出: 輸出檔案只有一行,即可能輸出序列的總數目
樣例輸入:

3

樣例輸出:

5

答案:

#include <iostream>
using namespace std;
int main()
{
    int n,f[20]={0};
    cin>>n;
    f[0]=1;f[1]=1;
    for(int i=2;i<=n;i++)
       for(int j=0;j<i;j++)
          f[i]+=f[j]*f[i-j-1];
          cout<<f[n];
    return 0;
}

相關推薦

Catalan number

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

| Catalan number

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

catalan number

1.  卡特蘭數是什麼       卡塔蘭數是組合數學中一個常在各種計數問題中出現的數列。 公式為 : 前幾項為 (n=0,1,2,3,4,5時):     1, 1, 2, 5, 14, 42

程式設計師數學--Catalan number

10個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問有多少種排列方式? 我們可以先把這10個人從低到高排列,然後,選擇5個人排在第一排,那麼剩下的5個人肯定是在第二排。用0表示對應的人在第一排,用1表示對應的人在第二排,那麼含有5個0

Catalan的原理題目

Catalan數的定義令h(1)=1,Catalan數滿足遞迴式:h(n) = h(1)*h(n-1) +h(2)*h(n-2) + ... + h(n-1)h(1),n>=2該遞推關係的解為: 證明: 令1表示進棧,0表示出棧,則可轉化為求一個2n位、含n個1、n個0的二進位制數,滿

catalan總結 蘭大蘭大取模、應用

本文講解卡特蘭數的各種遞推公式,以及卡特蘭數、卡特蘭大數、卡特蘭大數取模的程式碼實現,最後再順帶提一下卡特蘭數的幾個應用。 什麼是卡特蘭數呢?卡特蘭數無非是一組有著某種規律的序列。重要的是它的應用。

【算法專題】計數數列

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

Catalan

tracking ng- iostream snippet log con pos using sin 卡塔蘭數(Catalan) 原理: 令h(0)=1,h(1)=1。 卡塔蘭數滿足遞推式:h(n)=h(0)*h(n-1)+h(1)*h(n-

JAVA

Game of Connections Description This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, ... , 2n - 1, 2n

hdu 1023 ——Train Problem II+高精度+java

Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7977

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

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

好像很有用的說

關於卡特蘭數 卡特蘭數是一種經典的組合數,經常出現在各種計算中,其前幾項為 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796,

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

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

超級bzoj 4706: B君的多邊形

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 92 [Submit][Status][Discuss] Descrip

數列Catalan

【概述】 卡特蘭數列是組合數學中一個常出現在各種計數問題中出現的數列,其前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ...... 卡特蘭數首先是由尤拉在計算對凸 n 邊形的不

--出佇列解法收集總結

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

洛谷P1044 :

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

n個數的出方式

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

,程式實現,遞迴,迴圈,BST出入順序的應用

 卡特蘭數是組合數學中的一種數列,它的來歷和重要性可以自行百度,我主要說它的特徵和程式設計實現。 前幾項是1, 1, 2, 5, 14, 42, 132……, 如果令h(0)=h(1)=1,那麼h(n)=h(0)*h(n-1)+h(1)*h(n-2) + .

Catalan

公式: n <= 2 時, f(n) = n; n > 2時, f(n) = (4n - 2) / (n+1) * f(n-1) 1-100的卡特蘭數列表如下: n             f(n) 1 1 2 2 3 5