左神算法进阶班5_3求公司的最大活跃度
Posted zzw1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左神算法进阶班5_3求公司的最大活跃度相关的知识,希望对你有一定的参考价值。
【题目】
一个公司的上下节关系是一棵多叉树,这个公司要举办晚会,你作为组织者已经摸清了大家的心理:
一个员工的直接上级如果到场,这个员工肯定不会来。
每个员工都有一个活跃度的值,决定谁来你会给这个员工发邀请函,怎么让舞会的气氛最活跃?
返回最大的活跃值。
举例:
给定一个矩阵来表述这种关系
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
以上是关于左神算法进阶班5_3求公司的最大活跃度的主要内容,如果未能解决你的问题,请参考以下文章