#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][0\sim 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]);
}
posted @ 2020-02-04 15:12  lemondinosaur  阅读(102)  评论(0编辑  收藏  举报