搞ACM也搞了不短的时间了,发现自己水平已经有很长时间停留在一个位置了,所以也是时候做下总结了。
题目大意:
给定节点数n,求出满足同层节点的子节点数目相同条件的有根树的数目。
解题思路:
这题是一道DP水题,OJ上有很多于此类似的题目。
对于节点数为n的情况,假设已经求出了节点数为1~n-1的满足条件的有根树的数目。取出一个节点作为根,假设根有m个子节点,则显然存在以这m个子节点为根的子树。由题目条件可知,当且仅当这m颗子树结构相同且同样满足上述条件时,这颗树是一棵满足条件的树。因此有m*k=n-1。所以得到dp方程dp[i]=Σdp[j] ((i-1)%j=0)。
源码:
#include<stdio.h>
#include<string.h>
int main()
{
int f[100];
int i,j,now=0,n;
memset(f,0,sizeof(f));
f[1]=f[2]=1;
for (i=3;i<=1000;++i)
{
for (j=1;j<i;j++)
{
if ((i-1)%j==0)
f[i]=(f[i]+f[j])%1000000007;
}
}
while (scanf("%d",&n)!=EOF)
{
printf("Case %d: %d\n",++now,f[n]);
}
}