17.没有上司的舞会 树形DP

 

拖欠很久的树形DP问题终于补上了

在树上做DP,图论 + 数据结构 + DP了解一下

样例画成图就是这样,最多是5

 

 一共有2 * n个状态,每个状态需要枚举这个点的所有儿子

时间复杂度近似O(n)

树是特殊的图,然后用邻接表存

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 6010;
 4 int n;
 5 int h[N], e[N], ne[N], idx;
 6 int happy[N];
 7 int f[N][2];
 8 bool has_fa[N];
 9 void add(int a, int b) {
10     e[idx] = b;
11     ne[idx] = h[a];
12     h[a] = idx++;
13 }
14 void dfs(int u) {
15     f[u][1] = happy[u];
16     for (int i = h[u]; ~i; i = ne[i]) {
17         int j = e[i];
18         dfs(j);
19         f[u][1] += f[j][0];
20         f[u][0] += max(f[j][0], f[j][1]);
21     }
22 }
23 int main() {
24     cin >> n;
25     for (int i = 1; i <= n; i++) {
26         cin >> happy[i];
27     }
28     memset(h, -1, sizeof h);
29     for (int i = 0; i < n - 1; i++) {
30         int a, b;
31         cin >> a >> b;
32         add(b, a);
33         has_fa[a] = true;
34     }
35     int root = 1;
36     while (has_fa[root]) {
37         root++;
38     }
39     dfs(root);
40     cout << max(f[root][0], f[root][1]) << endl;
41     return 0;
42 }
原文地址:https://www.cnblogs.com/fx1998/p/13247089.html