HDU-#4472 Count(DP)

来源:互联网 发布:马龙 王皓 知乎 编辑:程序博客网 时间:2024/06/05 04:06

         题目大意:给出n个结点,问能够构成多少种完全对称的树。

        解题思路:题目比较难懂的是理解那句要求同一层结点的子结点要求完全一样,就是完全对称的意思。开始以为是规律题,推了很久的都规律,最后还是跪了,看了题解才知道是一道简单DP,之前一直都跳过了DP,看来基础的还是要去学习的!理解了就可以递推出该状态转移方程:dp[i]=sum(dp[j]),(i-1)%j==0.然后根据这个打表即可,详见code。

        题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4472

        code:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define ll __int64const int MAXN = 1e4+10;const int MOD = 1e9+7;ll dp[MAXN];int cas,n;void init(){    memset(dp,0,sizeof(dp));    dp[1]=dp[2]=1;    for(int i=3;i<MAXN;++i)        for(int j=1;j<i;++j)            if((i-1)%j==0)                dp[i]=(dp[i]+dp[j])%MOD;}int main(){    //freopen("input.txt","r",stdin);    init();    while(~scanf("%d",&n)){        printf("Case %d: %I64d\n",++cas,dp[n]);    }    return 0;}

0 0
原创粉丝点击