版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960603/article/details/82224434
dp[i][j] – i 个节点不超过 j 层的方案数
有dp[i][j]+=dp[t][j-1]*dp[i-t-1][j-1]
根节点左子树dp[t][j-1] , 右子树dp[i-t-1][j-1]
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=210;
const int mod=9901;
int dp[maxn][maxn];
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++) dp[1][i]=1;
for(int i=2;i<=k;i++)
for(int j=3;j<=n;j+=2)
for(int t=1;t<=j-2;t+=2) dp[j][i]+=(dp[t][i-1]*dp[j-t-1][i-1]),dp[j][i]%=mod;
printf("%d\n",(dp[n][k]-dp[n][k-1]+mod)%mod);
}