[P1472] 奶牛家谱 (DP)

题意:给一棵度数为 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;
}
原文地址:https://www.cnblogs.com/nnezgy/p/11538407.html