#DP#CF9D How many trees?

Posted spare-no-effort

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#DP#CF9D How many trees?相关的知识,希望对你有一定的参考价值。

题目

(n)个点组成二叉树,问高度(geq h)的有多少个。


分析

首先前缀和相减就能得到答案,做dp
(dp[n][h])表示节点数为(n),高度不超过(h)的树的个数
那么(dp[n][h]=sum_{i=0}^{n-1}dp[i][h-1]*dp[n-i-1][h-1])
最后输出(dp[n][n]-dp[n][h-1]),初始值(dp[0][0sim n]=1)


代码

#include <cstdio>
#define rr register
using namespace std;
int n,h; long long dp[41][41];
signed main(){
    scanf("%d%d",&n,&h);
    for (rr int i=0;i<=n;++i) dp[0][i]=1;
    for (rr int i=1;i<=n;++i)
        for (rr int j=1;j<=n;++j)
            for (rr int k=0;k<j;++k) 
                dp[j][i]=dp[j][i]+dp[k][i-1]*dp[j-k-1][i-1];
    return !printf("%lld",dp[n][n]-dp[n][h-1]);
}

以上是关于#DP#CF9D How many trees?的主要内容,如果未能解决你的问题,请参考以下文章

HDU——1130 How Many Trees?

『题解』Codeforces9D How many trees?

HDU 1978 How many ways (DP)

[暑假集训--数位dp]LightOJ1140 How Many Zeroes?

hdu 1130How Many Trees?(卡特兰数)

hdu 1978 How many ways(dp)