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

Codeforces 161D(树形dp)

时间:2019-05-04 00:48:31      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:max   res   clu   ons   scan   mat   pre   class   argv   

\(dp[v][k]\)代表以\(v\)的子树为起点,以点\(v\)为终点长度为\(k\)的方案有多少种。
转移只需将子树加和;计算\(ans\)由两部分组成,一是\(dp[v][k]\),另一部分是经过\(v\)的方案数。

#include <cstdio>
#include <vector>
using std::vector;

const int maxn = 5e4 + 5, maxk = 505;
int n, k, dp[maxn][maxk], ans;
vector<int> adj[maxn];

void dfs(int cur, int fa) {
    long long res = 0;
    dp[cur][0] = 1;
    for (int u : adj[cur])
        if (u != fa) {
            dfs(u, cur);
            for (int j = 0; j < k; j++)
                dp[cur][j + 1] += dp[u][j];
        }
    for (int u : adj[cur])
        if (u != fa) {
            for (int j = 1; j < k; j++)
                res += (long long)dp[u][j - 1] * (dp[cur][k - j] - dp[u][k - j - 1]);
        }
    ans += res / 2 + dp[cur][k];
}

int main(int argc, char const *argv[]) {
    scanf("%d %d", &n, &k);
    for (int u, v, i = 1; i < n; i++) {
        scanf("%d %d", &u, &v);
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    return dfs(1, 0), !printf("%d\n", ans);
}

Codeforces 161D(树形dp)

标签:max   res   clu   ons   scan   mat   pre   class   argv   

原文地址:https://www.cnblogs.com/AlphaWA/p/10807137.html

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