首页 > 其他 > 详细

CF9D How many trees? (dp)

时间:2019-10-26 09:58:42      阅读:96      评论:0      收藏:0      [点我收藏+]

这题我想了好久

\(f_{i,j}\)\(i\) 结点 \(<=j\) 的方案数

固定根,枚举左右子树,就有:

\[f_{i,j}=\sum_{k=0}^{n-1}f_{k,j-1}*f_{i-k-1,j-1}\]

初始化 \(f_{0,i}=1\)

答案 \(ans=f_{n,n}-f_{n,h-1}\)

Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 40
#define int long long
using namespace std;
inline int read() {
    int x=0,f=1; char ch=getchar();
    while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
    return x * f;
}
int n,h;
int f[N][N];    //f[i][j] 表示 i个结点 高度为j 的方案总数 
signed main()
{
    n = read(), h = read();
    for(int i=0;i<=n;++i)
        f[0][i] = 1;
    for(int j=1;j<=n;++j)
        for(int i=1;i<=n;++i)
            for(int k=0;k<i;++k)
                f[i][j] += f[k][j-1]*f[i-k-1][j-1];
    cout<<f[n][n]-f[n][h-1]<<endl;
    return 0;
}

CF9D How many trees? (dp)

原文:https://www.cnblogs.com/BaseAI/p/11741737.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!