程序员代码面试指南 3.21:派对的最大快乐值
派对的最大快乐值
https://www.nowcoder.com/practice/a5f542742fe24181b28f7d5b82e2e49a
1、思路
多叉树问题,每名员工有若干个直接下级员工,除老板外,每名员工都有唯一的直接上级;
某一级节点来不来参加派对,要看这级节点来还是不来两种情况下,哪一种获得的收益最多,分两种情况:
1、当前节点来参加派对收的益
=当前节点的快乐值+其所有子节点不来参加派对的收益之和(注意:子节点不来参加派对的收益不一定为0,因为它的孙子节点可能来参加,这种情况要递归计算);2、当前节点不来参加派对的收益
=max(子节点来参加派对的收益, 子节点不来参加派对的收益)。
2、代码
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode
{
int happy;
vector<TreeNode*> employees;
TreeNode(int _happy) : happy(_happy) {}
};
struct ReturnData
{
int yes; //该员工来参加派对的收益
int no; //该员工不来参加派对的收益
ReturnData(int _yes, int _no) : yes(_yes), no(_no) {}
};
ReturnData* getMax(TreeNode *node)
{
int yesNode = node->happy; //该员工来参加派对的收益就是他本身的快乐值
int noNode = 0; //不来参加,收益先初始化为 0
if (node->employees.empty())
{
return new ReturnData(yesNode, noNode);
}
else //若子树不为空,继续递归计算子员工来与不来的收益
{
for (auto employee : node->employees)
{
ReturnData *subTreeInfo = getMax(employee);
yesNode += subTreeInfo->no;
noNode += max(subTreeInfo->yes, subTreeInfo->no);
}
}
return new ReturnData(yesNode, noNode);
}
int main()
{
int n, root;
cin >> n >> root;
int happyVal, boss, employee;
vector<TreeNode*> happy(n + 1);
for (int i = 1; i <= n; ++ i) //一共有 n 个员工,下标从 1 开始
{
cin >> happyVal;
happy[i] = new TreeNode(happyVal);
}
for (int i = 2; i <= n; ++ i) //除老板外一共有 n - 1 个员工,下标从 2 开始
{
cin >> boss >> employee;
happy[boss]->employees.push_back(happy[employee]);
}
ReturnData *allTreeInfo = getMax(happy[root]); //从根节点的老板开始
cout << max(allTreeInfo->yes, allTreeInfo->no) << endl;
return 0;
}
程序员代码面试指南(C++版题解) 文章被收录于专栏
主要是为左程云的《程序员代码面试指南》这本书改写C++版的题解。

