家谱
2010/05/15 下午 08:42
题目
在某个家谱中,每人都生两个儿子。这些人之间的关系可以用二叉树来表示。这些二叉树总共有N个节点(3 <= N < 200)。这些二叉树有如下性质:
每一个结点的度是0或2。度是这个结点的儿子的数目。
树的高度等于K(1 < K < 100)。高度是从根到任何叶子的最长的路径上的结点的数目。有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的。输出家谱树的个数除以9901之后的余数。
输入:
两个空格分开的整数, N和K。
输出:
一个整数,表示家谱树的个数除以9901之后的余数。
提示:
有5个结点,高为3的两个不同的家谱:
解题思路
此题看起来貌似无从下手,其实这是一道动态规划题。这题是 USACO2.3.2 上的奶牛家谱的翻译,详细的解题思路请上网查吧,我这题实在说不清楚,抱歉。
#include <iostream>
using namespace std;
long int N,K;
long int m[202][102];
int main()
{
int i,j,k;
cin>>N>>K;
for (i=1;i<=K;i++)
m[1][i]=1;
for (j=1;j<=K;j++)
for (i=1;i<=N;i+=2)
for (k=1;k<=i-2;k++)
m[i][j]=(m[i][j]+m[k][j-1]*m[i-1-k][j-1])%9901;
long int answer=((m[N][K]+9901-m[N][K-1])%9901);
cout<<answer<<endl;
return 0;
}