USACO Cow Pedigrees

  题意是给你一个高度为k节点数为N的二叉树, 每个节点的孩子数为0或者2,让你求出这样的二叉树的数量模9901,我们定义f[i][j]为i个节点构成高度不超过j的二叉树的数量, 那么f[i][j] = f[k][j-1]*f[i-1-k][j-1](乘法原理, 除掉根节点, 左儿子有k个节点,右儿子就有i-1-k个节点) ,由于每个节点的孩子书为0或者2, 那么i-1-k>=1 =>k<=i-2 又k>=1  =》 1<=k<=i-2.根据我们的定义答案就有(f[N][k] - f[N][k-1] + 9901)%9901防止负数的出现,代码如下:

/*
    ID: m1500293
    LANG: C++
    PROG: nocows
*/

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
int f[300][300];   //用n个节点做成深度小于等于j的二叉树的种类数

int main()
{
    freopen("nocows.in", "r", stdin);
    freopen("nocows.out", "w", stdout);
    int N, K;
    scanf("%d%d", &N, &K);
    for(int j=1; j<=K; j++) f[1][j] = 1;
    for(int j=2; j<=K; j++)       //深度为j
    for(int i=1; i<=N; i++)       //节点数为i
    {
        for(int k=1; k<=i-2; k++)
            f[i][j] = (f[i][j] + f[k][j-1]*f[i-1-k][j-1])%9901;
    }
    printf("%d\n", (f[N][K]-f[N][K-1]+9901)%9901);
    return 0;
}

 

posted @ 2015-12-25 20:05  xing-xing  阅读(149)  评论(0编辑  收藏  举报