码迷,mamicode.com
首页 > 其他好文 > 详细

#DP#CF9D How many trees?

时间:2020-02-04 15:29:33      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:signed   def   高度   超过   return   初始   inline   int   mat   

题目

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

#DP#CF9D How many trees?

标签:signed   def   高度   超过   return   初始   inline   int   mat   

原文地址:https://www.cnblogs.com/Spare-No-Effort/p/12259536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!