题意:求n个点可以构成多少个不同的深度为不少于h的二叉树。
做法:暴力枚举,确定每次的数中含有的节点数,然后再枚举左右子树的深度节点数即可
#include <iostream>
#include <cstdio>
#include <cstring>
#define LL long long
const int LMT=40;
using namespace std;
int n,h;
LL dp[LMT][LMT];
int main()
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
LL ans=0;
cin>>n>>h;
for(int i=1;i<=n;i++)
for(int hi=1;hi<=i;hi++)
for(int j=0;j<i;j++)
for(int l=0;l<=j;l++)
for(int r=0;r<=i-1-l;r++)
if(1+max(r,l)==hi)
dp[i][hi]+=dp[j][l]*dp[i-1-j][r];
for(int i=h;i<=n;i++)ans+=dp[n][i];
cout<<ans<<endl;
return 0;
}