文章目录
- 1. 题目描述
- 2. 我的尝试
- 1. 卡特兰数
- 2. 动态规划
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;
}