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; }