洛谷 P1122 最大子树和

题目链接:最大子树和



思路

       由于可以无限剪枝,所以假设以节点1为根,并删去所有美丽质数小于0的子树,又考虑到可能会出现根节点为负数,导致可能会只留下子树而把节点1为根节点的其他部分扔掉,所以需要dp数组记录,dp[i]为以节点i为根节点能得到的最大的美丽指数,贪心将节点i的子树中所有美丽指数之和小于0的子树全部丢掉。由于dp是从简单的问题推导出复杂的问题,所以需要先解决叶子节点,先dfs搜索再求结果。然后找出以每个节点为根节点得到的最大美丽指数中的最大值就是答案。


题解

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4;
#define ll long long

ll n, beautiful[N], f[N];
vector<int> edge[N];

void dfs(int x, int fa) {
  f[x] = beautiful[x];
  int len = edge[x].size();
  for (int i = 0; i < len; i++) {
    if (edge[x][i] == fa)
      continue;
    dfs(edge[x][i], x);
    if (f[edge[x][i]] > 0) {
      f[x] += f[edge[x][i]];
    }
  }
}

int main() {
  cin >> n;

  for (int i = 1; i <= n; i++) {
    cin >> beautiful[i];
  }

  for (int i = 1; i < n; i++) {
    int a, b;
    cin >> a >> b;
    edge[a].push_back(b);
    edge[b].push_back(a);
  }

  dfs(1, 0);

  ll res = - 2147483647;
  for (int i = 1; i <= n; i++) {
    res = max(res, f[i]);
  }

  cout << res << endl;
  return 0;
}
posted @ 2024-06-16 14:56  薛定谔的AC  阅读(7)  评论(0编辑  收藏  举报