51nod-1412 AVL树的种类
地址:http://www.51nod.com/Challenge/Problem.html#!#problemId=1412
思路:dp
dp[i][k]:表示i个结点,最大深度为k的个数。
转移方程:
dp[i][k]+=dp[j][k-1]*dp[i-1-j][k-1]
dp[i][k]+=2*dp[j][k-1]*dp[i-1-j][k-2]
Code:
#include<iostream>
using namespace std;
typedef long long LL;
const int MAX_N=2e3+5;
const LL MOD=1e9+7;
int n;
LL dp[MAX_N][17];
/*
dp[i][k]:表示i个结点,最大深度为k的个数。
转移方程:
dp[i][k]+=dp[j][k-1]*dp[i-1-j][k-1]
dp[i][k]+=2*dp[j][k-1]*dp[i-1-j][k-2]
*/
int main()
{
ios::sync_with_stdio(false);
cin>>n;
dp[0][0]=dp[1][1]=1;
for(int i=2;i<=n;++i)
for(int j=0;j<i;++j)
for(int k=2;k<17;++k)
{
dp[i][k]=(dp[i][k]+dp[j][k-1]*dp[i-1-j][k-1]%MOD)%MOD;
dp[i][k]=(dp[i][k]+dp[j][k-1]*dp[i-1-j][k-2]%MOD*2)%MOD;
}
LL ans=0;
for(int i=0;i<17;++i)
ans=(ans+dp[n][i])%MOD;
cout<<ans<<endl;
return 0;
}