51nod 1412
考虑到只与深度和点的个数有关
$f[n][d]$ 表示 $n$ 个点,深度为 $d$ 的 $AVL$ 树有多少种
枚举左子树大小为 $i$, 进行转移
并且深度为 $logn$ 级别
$f[n][d] = f[i][d - 1] * f[n - i - 1][d - 1] + f[i][d - 1] * f[n - i - 1][d -2] + f[i][d - 2] * f[n - i - 1][d - 1]$
#include <bits/stdc++.h> const int N = 2e3 + 10, Mod = 1e9 + 7; long long f[N][30], n; int main() { scanf("%d", &n); f[0][0] = 1; f[1][1] = 1; f[2][2] = 2; f[3][2] = 1; for(int i = 4; i <= n; i ++) { for(int d = 2; d <= 16; d ++) { for(int j = 0; j < i; j ++) { f[i][d] = (f[i][d] + (f[j][d - 1] * f[i - 1 - j][d - 1]) % Mod + (f[j][d - 1] * f[i - 1 - j][d - 2]) % Mod + (f[j][d - 2] * f[i - 1 - j][d - 1]) % Mod) % Mod; } } } int Ans(0); for(int i = 1; i <= n; i ++) Ans = (Ans + f[n][i]) % Mod; printf("%lld", Ans); return 0; }