#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?的主要内容,如果未能解决你的问题,请参考以下文章
『题解』Codeforces9D How many trees?