拖欠很久的树形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 }