7-2 运动会 (10 分)

题目

T公司的员工层级关系可以表示成一棵树,员工X是员工Y的直接领导,则在树中X是Y的父结点。公司拟组织一场运动会,但为了避免尴尬,每个员工都不想与自己的直接领导一起参赛。假定每个员工都对应一个权重(领导的权重不一定比下属大),请你编写程序,邀请若干员工参赛,使得参赛人员的总权重和最大。

输入格式

第一行一个正整数n,表示公司的员工人数,员工编号为1…n,n不超过3000。 接下来n行,每行1个整数,表示每个员工的权重,值域为[−27 , 27)。 接下来n-1行,每行为两个空格间隔的整数X和Y,表示Y是X的直接领导。

输出格式

输出为一个整数,表示参赛员工的最大权重之和。

输入样例

7
2
2
2
2
2
2
2
2 1
3 1
4 2
5 2
6 3
7 3

输出样例

10

基本思路

数组wi[maxn],下表为节点编号,值为为每个结点的权值。
利用邻接表vector v[maxn]来记录这棵多叉树。
找到根结点,用root保存。
分别使用数组记录每个结点的两种状态:

  • dp_join[i] 存储:当结点i加入时,该结点和它的下属结点所能得到的最大值
  • dp_no[i]存储://当结点i不加入时,它的下属结点所能得到的最大值

    状态转移方程为

    递推边界为
    dp_join[root] = wi[root]和dp_no[root] = 0//这里的root为叶子结点。

从根结点开始dfs,由叶子结点(递推边界)到根节点,维护dp_join[]和dp_no[]即可。
则答案即为 max(dp_join[root],dp_no[root])。

代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=3005;int n,root=1;//员工人数。根结点编号,初始化为1
bool hash_table[maxn];//下标为结点编号,值表示该结点是否是孩子结点
int wi[maxn];//下标为结点编号,值为结点权值
vector<int> v[maxn];//下标为结点编号,值为该结点的孩子结点的编号
//每个结点有如下两种状态(简称:状态一 和 状态二),含义请看注释
int dp_join[maxn];//当结点i加入时,该结点和它的下属结点所能得到的最大值
int dp_no[maxn];//当结点i不加入时,它的下属结点所能得到的最大值
//
void solve(int root){//递推边界(叶子结点)if(v[root].size()==0){dp_join[root] = wi[root];dp_no[root] = 0;return;}dp_join[root] = wi[root];/*因为当前结点的状态由它的子节点的状态推导而来,所以需要先dfs当前结点的子结点把它的子节点的两种状态计算出来,再回溯回来更新当前结点的两种状态当它的所有子节点的两种状态全部考虑完毕,当前结点的两种状态也随之确定*///当前结点的状态一dp_join[root]=wi[root]+每个子结点的状态二dp_no[wi[v[root][i]]]//上面这句话说明如果选了当前结点,那么它的子节点全部不能选,那只能选择子节点没有选的状态相加//当前结点的状态二dp_no[root]=每个子结点的状态一/状态二的最大值//上面这句话说明如果没选当前结点,那么它的子节点全部能选能不选,那选择子节点两种状态的较大者相加for (int i = 0; i < v[root].size();i++){solve(v[root][i]);dp_join[root] += dp_no[v[root][i]];dp_no[root] += max(dp_no[v[root][i]], dp_join[v[root][i]]);}
}
int main(){cin>>n;//读入每个结点的权值for(int i=1;i<=n;i++){cin>>wi[i];}//构建这棵树,并找出根结点编号for(int i=0;i<n-1;i++){int ans1,ans2;cin>>ans1>>ans2;v[ans2].push_back(ans1);hash_table[ans1]=true;}while(hash_table[root]) root++;//从根结点开始对这棵二叉树进行dfs,求出每个结点两种状态solve(root);//所能获得的最大权值就是dp_join[root]和dp_no[root]中的更大者cout << max(dp_join[root], dp_no[root]) << endl;return 0;
}

7-2 运动会 (10 分)相关推荐

  1. 考研国家线罕见大幅上涨,12个学科涨幅10分以上,超300万人将落榜

    金磊 博雯 发自 凹非寺 量子位 | 公众号 QbitAI 随着2022年研考国家线的发布,"考研"这一话题再次成为焦点. 据央视网报道,全国457万考研大军,院校计划招生人数约1 ...

  2. 7-5 密码锁 (10 分)

    7-5 密码锁 (10 分) 在神秘的乌啦啦国度有一个非常神秘的基地,多年来,小明家族一直在为前往神秘基地而努力着.终于在历经数千年的探索之后,他们来到了神秘基地的大门口. 现在他们站在入口处,但要进 ...

  3. C语言函数题-取子串 (10分)

    6-3取子串 (10分) 编写代码,完成从指定字符串中取指定子串的代码(不利用string.h类库),给定的是子串起始位置和长度,返回一个新的子字符串的首地址.如果起始位置不妥,返回空串.如果后面的子 ...

  4. C语言入门题-7-1 最大和最小 (10分)

    7-1 最大和最小 (10分) 请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差. 输入格式: 输入10个整数 输出格式: 无 输入样例: 1 2 3 4 ...

  5. C语言程序练习- L1-040 最佳情侣身高差 (10分)

    L1-040 最佳情侣身高差 (10分) 专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高).如果符合,你俩的身高差不管是牵手.拥抱.接吻,都是最 ...

  6. C语言程序练习-L1-018 大笨钟 (10分)

    L1-018 大笨钟 (10分) 微博上有个自称"大笨钟V"的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟 ...

  7. C语言程序练习- L1-010 比较大小 (10分)

    L1-010 比较大小 (10分) 本题要求将输入的任意3个整数从小到大输出. 输入格式: 输入在一行中给出3个整数,其间以空格分隔. 输出格式: 在一行中将3个整数从小到大输出,其间以"- ...

  8. PTA 判断对称矩阵 (10分)

    PTA 判断对称矩阵 (10分) 输入格式: 在第一行内给出n值(1<n<100). 从第二行以后给出n阶矩阵所有行的元素值. 输出格式: 当输入的n阶矩阵是对称矩阵,输出"Ye ...

  9. 10-4 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格 (10 分)思路+详解+测试用例

    前言:测试用表 贴心杰将这个测试表分享给大家 ,如果大家做题的时候发现那个点过不去,一定不要直接看别人的博客,先自己测试用例,如果思路也对 ,验证数据也对,还有错误 你再看看别人的思路!!! CREA ...

最新文章

  1. c语言编的游戏怎么在安卓平台使用,谁知道怎么把c语言写的游戏安装到安卓手机上面玩??...
  2. nginx中的event模块
  3. nginx linux源码编译安装,Linux源码编译安装nginx
  4. 教你如何玩转GitHub
  5. java中的io复用_从 Java 中的零拷贝到五种IO模型
  6. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...
  7. implay matlab,matlab free download - SourceForge
  8. 排列组合 “n个球放入m个盒子“里,再来一遍
  9. 计算机二级做的完吗,大学计算机二级都没过 毕业后却做起了IT。。。。。
  10. Vuex入门及进阶笔记
  11. 数据是一把双刃剑,IPFS/FIL存储助力发展,合理应用技术中
  12. jira图片_JIRA issue 中的标记语言(Textile)
  13. 7个实用的Python自动化代码,别再重复造轮子了!
  14. Mac OS X常用软件介绍
  15. 量化交易入门阶段——欧奈尔的CANSLIM模型(S 供需关系)
  16. Javaweb上传图片或文件到服务器,Tomcat服务器重新部署项目,会删除原来上传的文件的问题
  17. 计算机二进制表示小数,小数的二进制表示
  18. 《数据库系统原理》第一遍思维导图
  19. java的class文件反编译工具jad的应用
  20. R语言中quantmod金融分析包的实践

热门文章

  1. 完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
  2. 新冠疫情历史数据(COVID-19-Data)
  3. Linux centos7.6 安装elasticsearch8.x (es8) 教程
  4. 《高等数学》 第七版 同济大学
  5. OrCAD Capture CIS 17.2导入Altium Designer原理图
  6. docker 改host_Docker容器修改端口映射
  7. katalon错误: System could not generate internal.GlobalVariable file normally.
  8. VR和云服务,使出洪荒之力也难擦出火花
  9. [4G+5G专题-144]: 测试-频谱分析仪工作原理与测试结果分析
  10. 免签接口 个人二维码收款系统/微信支付支付宝支付二维码监听自动发货/个人免签系统/个人免签支付 微信.支付宝 个人支付监控