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;
}

猜你喜欢

转载自www.cnblogs.com/shandongs1/p/9451125.html