#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]);
}