Codeforces Round #382 (Div. 2) E. Ostap and Tree

来源:互联网 发布:湖州公务员网络学堂 编辑:程序博客网 时间:2024/06/07 15:57
树DP 初始化有个小技巧
#include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned int uii;const ll mod=1e9+7;int n,k,u,v;ll dp[105][45],f[45];bool vis[105];vector<int> vec[105];void dfs(int u) {    vis[u]=true;    dp[u][0]=dp[u][k+1]=1;    for (uii t=0;t<vec[u].size();++t) {        int v=vec[u][t];        if (vis[v])            continue;        dfs(v);        memset(f,0,sizeof f);        for (int i=0;i<=2*k;++i)            for (int j=0;j<=2*k;++j)                if (i+j<=2*k)                    f[min(i,j+1)]=(f[min(i,j+1)]+dp[u][i]*dp[v][j])%mod;                else                    f[max(i,j+1)]=(f[max(i,j+1)]+dp[u][i]*dp[v][j])%mod;        memcpy(dp[u],f,sizeof dp[u]);    }}int main(){    scanf("%d%d",&n,&k);    for (int i=0;i<n-1;++i) {        scanf("%d%d",&u,&v);        vec[u].push_back(v);        vec[v].push_back(u);    }    dfs(1);    ll res=0;    for (int i=0;i<=k;++i)        res=(res+dp[1][i])%mod;    printf("%lld\n",res);    return 0;}

0 0
原创粉丝点击