题目
派对的最大快乐值,整个公司的人员结构可以看作是一棵标准的、没有环的多叉树。树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。叶节点是没有任何下属的基层员工,除基层员工外,每个员工都有一个或多个直接下级。这个公司现在要办party,你可以决定哪些员工来,哪些员工不来。但是要遵循如下规则:
1.如果某个员工来了,那么这个员工的所有直接下级都不能来
2.派对的整体快乐值是所有到场员工快乐值的累加
3.你的目标是让派对的整体快乐值尽量大
给定一棵多叉树的头节点boss,请返回派对的最大快乐值。
- 构造递归子结构,由子树返回当前节点员工来和不来整个子树求得的值,同样和动态规划类似,从子问题向上累加求得答案
function getHappy(head) {
// 叶子节点情况
if (head?.nextList?.length === undefined || head?.nextList?.length === 0) {
return {
yes: head.value,
no: 0,
};
}
let yes = head.value; // 统计当前节点来的情况
let no = 0; // 统计当前节点不来的情况
for (let i = 0; i < head.nextList.length; i++) {
// 从最后一层开始
const nextInfo = getHappy(head.nextList[i]);
// yes和no都是上级的变量,意味着当前遍历结束,上一级就知道了结果
yes += nextInfo.no; // 当上级来的时候,统计下级不来的情况
no += Math.max(nextInfo.yes, nextInfo.no); // 当上级不来的时候,下级可能来也可能不来,统计最大的情况下的结果
}
return { yes, no };
}
const info = getHappy(head);
console.log(Math.max(info.yes, info.no));