平衡二叉树(AVL树),是指左右子树高度差至多为1的二叉树,并且该树的左右两个子树也均为AVL树。 现在问题来了,给定AVL树的节点个数n,求有多少种形态的AVL树恰好有n个节点。
Input
一行,包含一个整数n。 (0 < n <= 2000)
Output
一行表示结果,由于结果巨大,输出它对1000000007取余数的结果。
Input示例
10
Output示例
60#include <iostream> #include <cstdio> using namespace std; typedef long long int ll; const int MOD = 1e9 + 7; const int MAXN = 2005; const int tier = 16; ll dp[MAXN][tier]; void init() { dp[0][0] = 1; dp[1][1] = 1; for (int i = 2; i < MAXN; i++) { for (int k = 2; k < tier; k++) { for (int j = 0; j < i; j++) { dp[i][k] += dp[i - j - 1][k - 1] * dp[j][k - 1]; dp[i][k] %= MOD; dp[i][k] += 2 * dp[i - j - 1][k - 2] * dp[j][k - 1]; dp[i][k] %= MOD; } } } return ; } int main() { int n; init(); cin >> n; ll result = 0; for (int i = 1; i < tier; i++) { result += dp[n][i]; result %= MOD; } cout << result << endl; return 0; }