左神算法进阶班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求公司的最大活跃度的主要内容,如果未能解决你的问题,请参考以下文章

左神算法进阶班3_1构造数组的MaxTree

左神算法进阶班1_5BFPRT算法

左神算法进阶班6_1LFU缓存实现

左神算法进阶班1_1添加最少字符得到原字符N次

左神算法基础班3_13深度拷贝含有随机指针的链表

左神算法课子数组最大差值小于某阈值,求满足条件的子数组个数