题意:给一棵度数为 0或 2的二叉树,求有 n个节点的深度为 k的二叉树的方案数;
解法:DP;
1.DP;我们可以设 f [ i ] [ j ] 表示有 i个节点的深度 <= j的二叉树的方案数,那么很显然,最后的答案就是 f [ n ] [ k ] - f [ n ] [ k - 1 ] ,那么状态转移方程该如何写呢?假设这整棵树有 x个节点,此时这棵树的深度为 k,那么除去根节点,我们可以枚举有 t个节点在左子树,有 x - 1 - t个节点在右子树,所以得出 f [ x ] [ k ] = ∑ ( f [ t ] [ k - 1 ] × f [ x - 1 - t ] [ k - 1 ] ) ;
附上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int mod = 9901;
int n,k;
int f[210][210];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=k;++i) f[1][i]=1;
for(int x=1;x<=k;++x)
for(int i=3;i<=n;i+=2)
for(int j=1;j<i;j+=2) f[i][x]=(f[i][x]+(f[j][x-1]*f[i-j-1][x-1]%mod))%mod;
cout<<(f[n][k]-f[n][k-1]+mod)%mod;
return 0;
}