挺经典的DP。
dp[i][j]表示高度为i,节点数为j时的方案总数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,h,i,lef,rig,k,ans;
long long dp[40][40];
while(~scanf("%lld%lld",&n,&h))
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
dp[1][1]=1;
for(i=2;i<=n;i++)
{
for(lef=0;lef<=min(n,(1ll<<(i-1)));lef++)
{
for(rig=0;rig<min(n-lef,(1ll<<(i-1)));rig++)
{
for(k=0;k<=i-1;k++)
dp[i][lef+rig+1]+=dp[k][lef]*dp[i-1][rig];
for(k=0;k<=i-1;k++)
dp[i][lef+rig+1]+=dp[i-1][lef]*dp[k][rig];
dp[i][lef+rig+1]-=dp[i-1][lef]*dp[i-1][rig];
}
}
}
ans=0;
for(i=h;i<=n;i++)
ans+=dp[i][n];
printf("%lld\n",ans);
}
}