HDU4472 Count

  原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4472

  动态规划, 记忆化搜索。

  设此时总节点数位n,则余下的节点总数为k = n - 1,因为同一级节点的子节点数要相同,只需对k的所有因子进行子结构搜索。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 const int mod = 1000000007;
 5 const int maxn = 1000 + 2;
 6 
 7 int f[maxn];
 8 
 9 int cal(int n)
10 {
11     if(f[n] != -1)
12         return f[n];
13     int ans = 0, i;
14     ans += cal(n - 1);
15     int k = n - 1;
16     for(i = 2; i < n; i ++)
17     {
18         if(k % i == 0)
19             ans += cal(k - k / i * (i - 1));
20     }
21     return ans;
22 }
23 
24 void init()
25 {
26     memset(f, -1, sizeof f);
27     f[0] = 0, f[1] = 1, f[2] = 1;
28     for(int i = 3; i < maxn; i ++)
29         f[i] = cal(i) % mod;
30 }
31 
32 int main()
33 {
34     int n, cas = 1;
35     init();
36     while(scanf("%d", &n) == 1)
37     {
38         printf("Case %d: %d\n", cas++, f[n]);
39     }
40     return 0;
41 }

 

posted @ 2012-11-19 20:07  芒果布丁  阅读(260)  评论(0编辑  收藏  举报