- 卡特蘭數(shù)
Catalan數(shù)是組合數(shù)學(xué)中一個(gè)常出現(xiàn)在各種計(jì)數(shù)問(wèn)題中出現(xiàn)的數(shù)列哀军。由以比利時(shí)的數(shù)學(xué)家歐仁·查理·卡塔蘭 (1814–1894)命名突硝。
原理:
令h(0)=1,h(1)=1,catalan數(shù)滿足遞歸式:
h(n)= h(0)h(n-1) + h(1)h(n-2) + + h(n-1)h(0) (其中n>=2)
該遞推關(guān)系的解為:
h(n)=C(2n,n)/(n + 1) (n=1,2,3,)
另類遞歸式: h(n)=((4n-2)/(n+1))h(n-1);
unsigned long long fact(int n, int k) {
if(k > 0) {
if(n == 0 && n == 1) {
return 1;
} else {
return n * fact(n-1, k-1);
}
} else {
return 1;
}
}
int numTrees(int n) {
// write your code here
return (int)(fact(2*n, n) / fact(n, n) / (n+1));
}
- 動(dòng)態(tài)規(guī)劃
class Solution {
public:
/**
* @paramn n: An integer
* @return: An integer
*/
int numTrees(int n) {
vector<int> dp(n+1, 0);
dp[0] = dp[1] = 1;
for(int i = 2; i <= n; ++i) {
for(int j = 0; j <= i-1; ++j) {
dp[i] += dp[j]*dp[i-1-j];
}
}
return dp[n];
}
};