AVL树的种类
10
60
【分析】问有n个节点的平衡二叉树的个数
2000个节点,不超过20行,dp[i]j[]代表i个节点,高为j的AVL树个数。
dp[i][j]+=dp[k][j-1]*dp[i-k-1][j-1] + dp[k][j-1]*dp[i-k-1][j-2]*2;
dp[k][j-1]表示高为j-1,k个点的左子树个数,dp[ki-k-1[j-1]表示高为j-1,i-k-1个点的右子树个数,
左右子树高度差为1时,可能左边高,也可能右边高,故乘2。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 2000 + 10;
const int MOD = 1000000007;
#define cl(a,b) memset(a,b,sizeof a);
LL dp[maxn][20];
void init()
{
cl(dp,0);
dp[0][0]=1;
dp[1][1]=1;
for(int i=2;i<maxn;i++){
for(int j=2;j<20;j++){
for(int k=0;k<i;k++){
dp[i][j]+=dp[k][j-1]*dp[i-k-1][j-1]%MOD + dp[k][j-1]*dp[i-k-1][j-2]*2%MOD;
dp[i][j] %= MOD;
}
}
}
}
int main()
{
init();
int n;
while(~scanf("%d",&n)){
LL ans = 0;
for(int i=0;i<20;i++){
ans+=dp[n][i]%MOD;
}
printf("%lld\n",ans%MOD);
}
return 0;
}