51nod 1412
题目
中文题目
思路
dp[i][k]表示节点个数为i,深度为K的AVL个数,
1.dp[i][k] += dp[i-1-j][k-1] * dp[j][k-1]
2.dp[i][k] += 2* dp[i-1-j][k-2] * dp[j][k-1]
我猜是排除根节点,拼接右子树,有子树深度一样和不一样两种。后一种又有两种。深度看log(n)估计。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <iostream>
using namespace std ;
typedef long long ll;
const ll mod=1000000007;
ll dp[2010][16];
void init()
{
dp[0][0]=1;
dp[1][1]=1;
for(int i=2; i<=2000; i++)
for(int k=2; k<=15; k++)
for(int j=0; j<i; j++)
{
dp[i][k]=(dp[i][k]+dp[i-j-1][k-1]*dp[j][k-1]%mod)%mod;
dp[i][k]=(dp[i][k]+2*dp[i-j-1][k-2]*dp[j][k-1]%mod)%mod;
}
}
int main()
{
int n;
scanf("%d",&n);
init();
ll ans=0;
for(int i=1; i<16; i++)
ans=(ans+dp[n][i])%mod;
printf("%I64d\n",ans);
return 0 ;
}