棧和卡特蘭數(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)的名字來命名。(卡特蘭數百度百科)
公式①:
公式②:
注意!!!
程式運算時使用第二種方法(第一種在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。
現在可以進行兩種操作,
- 將一個數,從運算元序列的頭端移到棧的頭端(對應資料結構棧的push操作)
- 將一個數,從棧的頭端移到輸出序列的尾端(對應資料結構棧的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