您的位置:首页 > 其它

[USACO2.3]奶牛家谱 Cow Pedigrees

2017-07-17 13:10 246 查看


题目描述

农民约翰准备购买一群新奶牛。 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛。这些奶牛间的关系可以用二叉树来表示。这些二叉树总共有N个节点(3 <= N < 200)。这些二叉树有如下性质:

每一个节点的度是0或2。度是这个节点的孩子的数目。

树的高度等于K(1 < K < 100)。高度是从根到最远的那个叶子所需要经过的结点数; 叶子是指没有孩子的节点。

有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的。输出可能的家谱树的个数除以9901的余数。


输入输出格式

输入格式:

两个空格分开的整数, N和K。

输出格式:

一个整数,表示可能的家谱树的个数除以9901的余数。


输入输出样例

输入样例#1:
5 3


输出样例#1:
2


说明

/*
ID:luojiny1
LANG:C++
TASK:nocows
*/
#include<cstdio>
#include<cstring>
const int maxn=210,maxh=110;
int d[maxh][maxn]={0},f[maxh][maxn]={0},n,h,c;

int main()
{
freopen("nocows.in","r",stdin);
freopen("nocows.out","w",stdout);
scanf("%d%d",&n,&h);
d[1][1]=1;
for(int i=2;i<=h;i++)
{
for(int j=1;j<=n;j+=2)
{

for(int k=1;k<=j-1-k;k+=2)
{
if(k!=j-1-k)c=2;else c=1;
d[i][j]+=c*(
f[i-2][k]*d[i-1][j-1-k]+//左边子树小于i-1 右边子树i-1
d[i-1][k]*f[i-2][j-1-k]+//右边子树小于i-1 左边子树i-1
d[i-1][k]*d[i-1][j-1-k]);//左右两边都为i-1
d[i][j]%=9901;
}
}
for(int k=1;k<=n;k++)f[i-1][k]=(f[i-2][k]+d[i-1][k])%9901;
}
printf("%d\n",d[h]
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: