思路
设一个F[n+1]为树形DP的数组。在点i上,对于每一个子节点j,都有F[j] = dis[i] + max(0, F[j])。其中dis是美丽指数。
代码
// P1122.cpp #include <iostream> #include <algorithm> using namespace std; // the tree; const int maxn = 160010; int n; int dis[maxn]; int to[maxn]; int next[maxn]; int point[maxn]; int current = 0; int F[maxn]; int ans = 0; void add_edge(int src, int dst) { next[current] = point[src]; to[current] = dst; point[src] = current; current++; } // core code: search subtrees and add them up to F[curt], // in the meanwhile, get the ans; void DFS(int curt, int fat) { F[curt] = dis[curt]; for (int i = point[curt]; i != -1; i = next[i]) { int dst = to[i]; if (dst == fat) continue; DFS(dst, curt); F[curt] += max(0, F[dst]); } ans = max(ans, F[curt]); } // initialize; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> dis[i]; fill(point, point + n + 1, -1); fill(next, next + n + 1, -1); fill(F, F + n + 1, 0); int a, b; for (int i = 0; i < n - 1; i++) { cin >> a >> b; add_edge(a, b), add_edge(b, a); } DFS(1, 0); cout << ans; return 0; }