正题
题目链接:https://www.luogu.com.cn/problem/CF9D
题目大意
求nnn个点组成的深度大于hhh的二叉树有多少个。
解题思路
定义fi,jf_{i,j}fi,j表示iii个点高度为jjj的树有多少个,然后每次将两棵(a,b)(x,y)(a,b)(x,y)(a,b)(x,y)合并就有
fa+x+1,max{b,y}+1+=fa,b∗fx,yf_{a+x+1,max\{b,y\}+1}+=f_{a,b}*f_{x,y}fa+x+1,max{b,y}+1+=fa,b∗fx,y
然后O(n4)O(n^4)O(n4)转移即可。
好像可以用前缀和优化到O(n3)O(n^3)O(n3)但是懒就不写了。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=40;
ll n,k,ans,f[N][N];
int main()
{scanf("%lld%lld",&n,&k);f[0][0]=1;for(ll i=1;i<=n;i++){for(ll x=0;x<=i;x++)for(ll y=0;y<i;y++)for(ll b=0;b<i;b++)f[i][max(y,b)+1]+=f[i-x-1][y]*f[x][b];}for(ll i=k;i<=n;i++)ans+=f[n][i];printf("%lld",ans);
}