この質問は、私は長い時間のためだと思います
セット\(F_ {I、J} \) の\(Iは\)ノード\(<= J \)プログラムの数で
固定ルート、列挙サブツリーについて、があります。
\ [F_ {I、J} = \ sum_ {k = 0} ^ {N-1} F_ {K、J-1} * F_ {IK-1、J-1} \]
初期化\(F_ {0、I} = 1 \)
回答\(ANS = F_ {N、 N} -f_ {N、H-1} \)
コード
#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;
}