51nod 1412 AVL树的种类(dp)

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 ;
}
    原文作者:AVL树
    原文地址: https://blog.csdn.net/pibaixinghei/article/details/52431992
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞