【题目】
一个公司的上下节关系是一棵多叉树,这个公司要举办晚会,你作为组织者已经摸清了大家的心理:
一个员工的直接上级如果到场,这个员工肯定不会来。
每个员工都有一个活跃度的值,决定谁来你会给这个员工发邀请函,怎么让舞会的气氛最活跃?
返回最大的活跃值。
举例:
给定一个矩阵来表述这种关系
matrix =
{
1,6
1,5
1,4
}
这个矩阵的含义是:
matrix[0] = { 1 , 6 },表示0这个员工的直接上级为1, 0这个员工自己的活跃度为6
matrix[1] = { 1 , 5 },表示1这个员工的直接上级为1(他自己是这个公司的最大boss), 1这个员工自己的活跃度为5
matrix[2] = { 1 , 4 },表示2这个员工的直接上级为1, 2这个员工自己的活跃度为4
为了让晚会活跃度最大,应该让1不来,0和2来。最后返回活跃度为10
【题解】
使用动态规划
每个节点保存其活跃度
然后嘛整棵树按照等级进行展开
x1来的活跃度为:x1的活跃度 + x1所有子节点不来的活跃度
x1不来的活跃度:x1不来 + x1所有子节点的每个节点中的max(来,不来)
【代码】
1 #pragma once 2 #include <iostream> 3 #include <vector> 4 5 using namespace std; 6 7 void process(vector<vector<int>>data, vector<vector<int>>&dp, vector<bool>isVist, int& root) 8 { 9 isVist[root] = true;//遍历过 10 dp[root][1] = data[root][1];//获取活跃值 11 for (int i = 0; i < data.size(); ++i) 12 { 13 if (data[i][0] == root && !isVist[i]) 14 { 15 process(data, dp, isVist, i); 16 dp[root][1] += dp[i][0]; 17 dp[root][0] += dp[i][0] > dp[i][1] ? dp[i][0] : dp[i][1]; 18 } 19 } 20 } 21 22 23 24 //使用动态规划解题 25 int getMaxHappy(vector<vector<int>>data) 26 { 27 vector<vector<int>>dp(data.size(), vector<int>(data[0].size(), 0)); 28 vector<bool>isVist(data.size(), false); 29 int root = 0;//找到boss 30 for (int i = 0; i < data.size(); ++i) 31 if (data[i][0] == i)//自己是自己的 上司,则此人为boss 32 { 33 root = i; 34 break; 35 } 36 process(data, dp, isVist, root); 37 return dp[root][0] > dp[root][1] ? dp[root][0] : dp[root][1]; 38 } 39 40 41 void Test() 42 { 43 vector<vector<int>>data; 44 data = { {1,6},{1,5},{1,4} }; 45 cout << getMaxHappy(data) << endl; 46 }
原文地址:https://www.cnblogs.com/zzw1024/p/11073295.html
时间: 2024-10-08 03:45:09