之江學院 M qwb與二叉樹 卡特蘭數 dp

2021-08-01 23:34:30 字數 1401 閱讀 2693

problem m: qwb與二叉樹

time limit: 1 sec memory limit: 128 mb

submit: 121 solved: 24

[submit][status][web board]

description

某一天,qwb正在上資料結構課。老師在講台上面講著二叉樹,qwb在下面發著呆。

突然qwb想到乙個問題:對於一棵n個無編號節點,m個葉子的有根二叉樹,有多少種形態吶?你能告訴他嗎?

input

多組輸入,處理到檔案結束,大約有104組資料。

每一組輸入一行,兩個正整數n,m(0≤m≤n≤50),意義如題目所述。

output

每一行輸出乙個數,表示相應詢問的答案,由於答案可能很大,請將答案對109+7取模後輸出。

sample input

4 2

10 5

sample output

6 252

** 比賽的時候一直以為自己模擬錯了…我也不知道為什麼一直以為自己模擬錯了…最後10min的時候發現自己模擬的是對的…都不知道當時發生了什麼…..

有一道經典面試題是問有n個節點的二叉樹有多少種不同的形態

那麼用遞迴的方式可以考慮出:

當節點只有1個的時候,f(1)=1;

當節點只有2個的時候,f(2)=f(1)*f(0)+f(0)*f(1)

當節點只有3個的時候,f(3)=f(2)*f(0)+f(1)*f(1)+f(0)*f(2)

//以乙個點為根,它的左子樹和右子樹所有節點數的所有可能性

類推可以得到f(n)=f(n-1)f(0)+f(n-2)f(1)+……….+f(1)f(n-2)+f(0)f(n-1)

//這裡這個公式剛好是卡特蘭數…

——————

如果能理解上面的推導,那這道題無非就是在上面的推導過程中增加乙個葉子數

f[i][j]表示節點有i個,葉子有j個的狀態數

那麼狀態轉移就直接轉移就可以了….f[i][j]可以從上面的每個子樹情況中計算所有葉子數加起來為j的狀態數…

這種每個點都有兩種往下的變化的,卡特蘭數的原型

引用資料:

#include 

using

namespace

std;

const

int maxn=60;

typedef

long

long ll;

ll dp[maxn][maxn];

const

int mod=1e9+7;

int n,m;

void init()

}if(x==y)}}

}int main()

}

卡特蘭數和二叉樹的構造

卡特蘭數 f n c2 nn c 2nn 1f n c n c f n c 2nn c2n n 1 簡要介紹含義 長度為2n的01序列,0 1各n個,要求前任意個數字中,1的數量 geq 0的數量.詳細請看大佬原文章 應用 1.入棧順序確定,求出棧順序。1表示入棧,0表示出棧,因為要先入棧才能出棧,...

卡特蘭數 不同的二叉搜尋樹

卡特蘭數是組合數學中乙個常出現在各種計數問題 現的數列。其公式為 c n c 2 c n 1 c 3 c n 2 c n 1 c 2 假設n個節點存在 即有 g n f 1 f 2 f 3 f 4 f n n為根節點,當i為根節點時,其左子樹節點個數為 1,2,3,i 1 右子樹節點個數為 i 1,...

2019 二叉樹形態總數(卡特蘭數)

題目描述 給定二叉樹的節點總數 n,輸出二叉樹形態總數,n 1000 輸入 3 輸出 5 n個結點組成的二叉樹形態總數 卡特蘭數 cmn n 1 c m n n 1 cmn n 1 其中m 2n。可以寫乙個cmn函式將分子一塊計算出來,最後除以n 1即可。由於n 1000時,計算c會比較大,所以不能...