1. 程式人生 > >C++實現——卡特蘭數列及其應用

C++實現——卡特蘭數列及其應用

這裡寫圖片描述
/*
卡特蘭數列的原理及其應用場景
令h(1)=1,catalan數滿足遞迴式:
h(n)= h(1)*h(n-1) + h(2)*h(n-2) + … + h(n-1)h(1) (其中n>=2)
該遞推關係的解為:h(n)=c(2n-2,n-1)/n (n=1,2,3,…)
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
1.括號化問題。


矩陣鏈乘: P=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)
2.出棧次序問題。
一個棧(無窮大)的進棧序列為1,2,3,..n,有多少個不同的出棧序列?
類似:有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)
3.將多邊行劃分為三角形問題。
將一個凸多邊形區域分成三角形區域的方法數?
類似:一位大城市的律師在她住所以北n個街區和以東n個街區處工作。每天她走2n個街區去上班。如果他
從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?
類似:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?

*/
//具體程式碼實現如下:

#include <iostream>
using namespace std;
//卡特蘭數列原理及應用
int catalan(int n){

    if (n == 1)return 1;
    if (n == 2)return 1;
    int res = 0;
    for (int i = 1; i <= n - 1;i++){
        res += catalan(i)*catalan(n - i);
    }
    return res;

}
//測試函式
int main(){
    int n;
    while
(cin >> n){ cout << catalan(n) << endl; } return 0; }

相關推薦

C++實現——數列及其應用

/* 卡特蘭數列的原理及其應用場景 令h(1)=1,catalan數滿足遞迴式: h(n)= h(1)*h(n-1) + h(2)*h(n-2) + … + h(n-1)h(1) (其中n>=2) 該遞推關係的解為:h(n)=c(2n-2,n-

一道面試題到及其應用

繪畫展覽門票每張5元,如果有2n個人排隊購票,每人一張,並且其中一半人恰有5元錢,另一半人恰有10元錢,而票房無零錢可找,那麼如何將這2n個人排成一列,順次購票,使得不至於因票房無零錢可找而耽誤時間,應該採用什麼演算法解決呢?(分支限界法) 這個是卡特

及其應用

一道棧的題目 最近做一道有關棧的題目,題目是這樣的:       若一序列進棧順序為e1,e2,e3,e4,e5,問存在多少種可能的出棧序列?       這道題用遞推可以算出來,假設第k個數進棧,設f(k)表示k個數的總出棧序列數,則它前面的k-1個數有f(k-1)種出棧

數列程式設計實現(go)

1. 推導公式 2.卡特蘭數列程式設計實現 方法一: func numTrees(n int) int { if 0 == n || 1 == n { return 1 } G := make([]int, 0) G = append(G, 1) G = ap

「BZOJ1485」[HNOI2009] 有趣的數列 數列

alt class ++ use 要求 現在 前三 inpu space 「BZOJ1485」[HNOI2009] 有趣的數列 Description 我們稱一個長度為2n的數列是有趣的,當且僅當該數列滿足以下三個條件: (1)它是從1到2n共2n個整數的一

<Catalan>楊輝三角實現數計算方法

算是刷到一個比較好的方法吧 計算卡特蘭數(Catalan) h(n)=C(2n,n)-C(2n,n-1)     #include<cstdio> #define siz 20 using namespace std; int n; int c[siz*

用JAVA 實現

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

及其使用典型例子

卡特蘭數是一個常用在計數情況中使用的一種特殊的數列,其原理如下:一、原理若令h(0)=1,h(1)=1,catalan數滿足遞推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)(可以寫成通式:)例:h(2

數列(Catalan )

簡述 卡特蘭數又稱卡塔蘭數,它是組合數學中一個常出現在各種計數問題中出現的數列,其前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ...... 公式 1.遞迴公式1    

數列(Catalan)

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

數的應用(易懂版)

不符合要求的數的特徵是由左而右掃描時,必然在某一奇數位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位數,即一個不

數(Catalan)及其應用

入棧 一個 其中 無法 數列 選擇 每天 編號 匹配 卡特蘭數 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特蘭數是組合數學中一個常出現在各種計數問題中出現的數列。 卡特蘭數前幾項為 : C0=

數的性質及其應用擴充套件

    問題描述:卡塔蘭數,是組合數學中一個常出現在各種計數問題中出現的數列。輸入一個整數n,計算h(n)。其遞迴式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(

數,程式實現,遞迴,迴圈,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) + .

【算法專題】數(計數數列

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

BZOJ 1485: [HNOI2009]有趣的數列(數)

傳送門 解題思路   因為總共是一個排列,那麼確定了奇數項是哪些,偶數項就確定了。怎麼判斷奇數項是否合法呢,其實由於第三個限制,可以把這個數列看成一個括號序列,奇數項為\((\),偶數項為\()\),那麼合法方案數自然是卡特蘭數了。。模數不是質數,而且\(n^2\)會超時,就只能用\(ans=\frac{

[bzoj1485][HNOI2009]有趣的數列_數_組合數

有趣的數列 bzoj-1485 HNOI-2009 題目大意:求所有1~2n的排列滿足奇數項遞增,偶數項遞增。相鄰奇數項大於偶數項的序列個數%P。 註釋:$1\le n\le 10^6$,$1\le P \le 10^9$。 想法:好題啊。 我們依次考慮1~2n,就是把當前$i$放進奇數項還是偶數

數在多種問題下的應用 組合數學-Catalan數

4)排隊順序問題1】長度為2n的Dyck words有多少種?(Dyck words是由n個X和n個Y組成的字串,其有一個特點:從左往右,對X和Y分別計數,Y的個數始終不大於X的個數。)轉化思路:可以把X看作入棧,Y看作出棧,Y的個數始終不大於X的個數這一性質正好和空棧無法再出棧相一致,所以Dyck word

數catalan證明及應用舉例

卡塔蘭數是組合數學中一個常在各種計數問題中出現的數列。其計算公式是 Cn=Cn2nn+1=(2n)!(n+1)!n!,n為自然數 C n

(Catalan)數列

卡特蘭數又稱卡塔蘭數,英文名 Catalan number,是組合數學中一個常出現在各種計數問題中出現的數列。以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名,其前幾項為 :