码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4472 Count

时间:2016-08-28 22:08:34      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

$dp$。

设$dp[i][j]$表示包含$i$个节点的最后一层有$j$个节点的树有多少种。

递推很简单,如果$j\% k =  = 0$,那么$dp[i][j]$就要加上$dp[i-j][k]$的方案。

本地跑大约$500-600ms$左右的时间就可以打完表了,$sumbit$发现跑了$900$多$ms$。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;

int dp[1005][1005],ans[1005];
int mod=1e9+7;

int main()
{
    dp[1][1]=1; ans[1]=1;
    for(int i=2;i<=1000;++i)
    {
        for(int j=1;j<=i-1;++j)
        {
            for(int k=1;k<=j;++k)
            {
                if(j%k==0)
                    dp[i][j]=(dp[i][j]+dp[i-j][k])%mod;
            }
            ans[i]=(ans[i]+dp[i][j])%mod;
        }
    }

    int cas=1,n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("Case %d: %d\n",cas++,ans[n]);
    }

    return 0;
}

 

HDU 4472 Count

标签:

原文地址:http://www.cnblogs.com/zufezzt/p/5816106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!