打卡记录
在树上执行操作以后得到的最大分数(树状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);
}
};