51nod-1412 AVL树的种类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/88560749

地址: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;
}

猜你喜欢

转载自blog.csdn.net/C_13579/article/details/88560749
今日推荐