打卡记录
在树上执行操作以后得到的最大分数(树状DP)
链接
大佬的题解
class Solution {
public:long long maximumScoreAfterOperations(vector<vector<int>> &edges, vector<int> &values) {vector<vector<int>> g(values.size());g[0].push_back(-1); // 避免误把根节点当作叶子for (auto &e: edges) {int x = e[0], y = e[1];g[x].push_back(y);g[y].push_back(x);}// dfs(x, fa) 计算以 x 为根的子树是健康时,失去的最小分数function<long long(int, int)> dfs = [&](int x, int fa) -> long long {if (g[x].size() == 1) { // x 是叶子return values[x];}long long loss = 0; // 不选 values[x]for (int y: g[x]) {if (y != fa) {loss += dfs(y, x); // 计算以 y 为根的子树是健康时,失去的最小分数}}return min((long long) values[x], loss); // 选/不选 values[x],取最小值};return accumulate(values.begin(), values.end(), 0LL) - dfs(0, -1);}
};