1. 题目描述
求 N 个结点能够组成的二叉树的个数。
输入格式
一个整数 N 。
输出格式
输出能组成的二叉树的个数。
数据范围
1
≤
N
≤
20
1≤N≤20
1≤N≤20
输入样例
3
输出样例
5
2. 我的尝试
1. 卡特兰数
直接代公式 r e s = C 2 n n ( n + 1 ) res = \frac {C_{2n}^n} {(n+1)} res=(n+1)C2nn
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
double res = 1;
cin >> n;
for (int i = 1; i <= n; i++)
res = res * (i + n) / i;
cout << (unsigned long long int)res / (n + 1);
return 0;
}
2. 动态规划
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
long long data[n+1];
data[0] = 1;
data[1] = 1;
for (int i=2; i<=n; i++){
long long sum = 0, l;
for (int r = 0; r <= i - 1; r ++){
l = i - r - 1;
sum += data[r] * data[l];
}
data[i] = sum;
}
printf("%lld\n", data[n]);
return 0;
}