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

树形DP

时间:2020-01-25 20:46:40      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:include   clu   name   back   cout   space   void   www   情况下   

树形DP是一种建立在树状结构的DP思想。
每个父结点的状态,都是由它的子结点转移过来的。

有一道很经典的入门题没有上司的舞会,就是每个结点都有一个权值且父子结点不能都取的情况下求最大总权值。
https://www.luogu.com.cn/problem/P1352

#include<bits/stdc++.h>
using namespace std;

const int maxn = 6010;
int N, R[maxn], h, p[maxn] = {0}, dp[maxn][2] = {0};
vector<int> g[maxn];

void dfs(int x) {
    dp[x][1] = R[x];
    for(auto c : g[x]) {
        dfs(c);
        dp[x][0] += max(dp[c][0], dp[c][1]);
        dp[x][1] += dp[c][0];
    }
}

int main() {
    cin >> N;
    for(int i = 1; i <= N; i++) scanf("%d", R + i);
    int a, b;
    for(int i = 0; i < N - 1; i++) scanf("%d%d", &a, &b), g[b].push_back(a), p[a] = 1;
    for(int i = 1; i <= N; i++) if(!p[i]) h = i;
    dfs(h);
    cout << max(dp[h][0], dp[h][1]);
}

树形DP

标签:include   clu   name   back   cout   space   void   www   情况下   

原文地址:https://www.cnblogs.com/nioh/p/12233358.html

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