- 卡特兰数
Catalan数是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
原理:
令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(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));
}
- 动态规划
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];
}
};
网友评论