没有上司的舞会 - 树形DP

news2024/11/23 6:54:01

目录

  • 题目描述
  • 前言
  • C++代码


题目描述

Ural 大学有 N N N 名职员,编号为 1 ∼ N 1∼N 1N

他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。

每个职员有一个快乐指数,用整数 H i H_i Hi 给出,其中 1 ≤ i ≤ N 1≤i≤N 1iN

现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。

在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

输入格式
第一行一个整数 N N N

接下来 N N N 行,第 i i i 行表示 i 号职员的快乐指数 Hi。

接下来 N − 1 N−1 N1 行,每行输入一对整数 L , K L,K L,K,表示 K K K L L L 的直接上司。

输出格式
输出最大的快乐指数。

数据范围
1 ≤ N ≤ 6000 , 1≤N≤6000, 1N6000,
− 128 ≤ H i ≤ 127 −128≤H_i≤127 128Hi127

输入样例:

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

输出样例:

5

前言

首先,如果将“上司”看作父结点,“下属”看作子结点,那么按照样例的员工从属关系,可以得到如下的一棵树。

请添加图片描述

而样例输出的 “5”,就是如图所示的五个蓝色结点组合而来,因为此时5号不是1、2、6、7的直接上属,可以将他们安排在同一个舞会,所以最大快乐指数就是它们的快乐指数之和。

如何考虑用树形DP的方法来做呢?

可以看到对于树中的每个结点,它都对应有两个选择:去或是不去舞会,即选不选中该结点

  • 如果选中该结点,那么它的所有直接子结点(如果有)都不可以被选择,因为如果此时还选择子结点也不会得到子结点的快乐指数。
  • 如果没有选中该结点,那么它的所有子结点选不选择都可以。

于是,可以找到DP的状态表示,即:

f ( u , 0 / 1 ) f(u,0/1) f(u,0/1)
集合:表示以 u u u为根结点(注意这不一定指总树的根),其所有子树的快乐指数和
属性:最大值
其中 f ( u , 0 ) f(u,0) f(u,0)表示方案中不包含 u u u结点,而 f ( u , 1 ) f(u,1) f(u,1)则表示方案中包含。

那么状态转移:
如果以happy[u]表示u结点的快乐指数,那么一开始,至少f[u][1] = happy[u],因为这表示选择了自己当最高层领导(相对于子结点讲),那就起码会有自己的快乐指数。

然后就是上面两项选择的转义,即

  • 如果选择结点u,那就只能加上直接下属不能被选择的方案,假设子结点为j(会有很多个),则 f ( u , 1 ) = Σ ( f ( j , 0 ) ) f(u,1) = Σ(f(j,0)) f(u,1)=Σ(f(j,0))
  • 如果不选择结点u,由于直接下属可被选择也可不被选择,所以取一个max,即 f ( u , 0 ) = Σ ( m a x [ f ( j , 0 ) , f ( j , 1 ) ] ) f(u,0) = Σ(max[f(j,0), f(j,1)]) f(u,0)=Σ(max[f(j,0),f(j,1)])

有了两个转移方程,那就只需从根结点开始往下,深搜一遍对于每个结点状态更新一遍。

最后的答案就在 f ( 总 根 结 点 , 0 ) f(总根结点,0) f(0) f ( 总 根 结 点 , 1 ) f(总根结点,1) f(1)两个方案里取一个max


C++代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 6010;

int f[N][2];        //f[u][*]:表示以u为根,其所有子树快乐指数和的最大值;0表示不选择u参加,1表示选择了u参加的方案。
int e[N], ne[N], h[N], idx = 0;
int happy[N];       //u的快乐指数
bool has_father[N];     //为了找根结点
int n;

void add(int a, int b){
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dfs(int u){
    f[u][1] = happy[u];     //选择了自己,至少有自己的快乐指数。
    
    for(int i = h[u];i != -1;i = ne[i]){
        int j = e[i];
        dfs(j);
        
        //状态转移方程,对每一个j
        f[u][0] += max(f[j][0], f[j][1]);
        f[u][1] += f[j][0];
    }
}

int main(){
    memset(h, -1, sizeof h);
    cin >> n;
    for(int i = 1;i <= n;i ++)      cin >> happy[i];
    for(int i = 1;i <= n - 1;i ++){
        int a, b;
        cin >> a >> b;
        add(b, a);      //b是a的父结点所以要b——>a才能成树
        has_father[a] = true;
    }
    
    int root = 1;
    while(has_father[root])     root ++;
    dfs(root);
    
    cout << max(f[root][0], f[root][1]) << endl;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch分布式搜索引擎安装保姆级教程

ElasticSearch分布式搜索引擎安装教程 一.Hr&#xff1a;ElasticSearch是什么&#xff1f; 答&#xff1a;Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#…

后端API接口性能优化的10种方案,真有用!

后端API接口性能优化的10种方案&#xff0c;真有用&#xff01; 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){insert(detail); } 优化后&#xff1a; batchInsert(transDetailList); 打个比喻&…

docker-compose的安装与卸载

compose项目是docker官方的开源项目,负责实现对Docker容器的快速编排 定位 定位是定义与运行多个docker容器的应用,同时可以对多个容器进行编排Compose 中有两个重要的概念&#xff1a; 服务 (service)&#xff1a;一个应用的容器&#xff0c;实际上可以包括若干运行相同镜像的…

电压跌落检测

1.前言 根据国际上较为权威的 IEEE 制定的标准可知&#xff0c;电压跌落是指电力系统中某点工频电压方均根值突然降低至 0.1p.u. ~ 0.9p.u.&#xff0c;并在短暂持续10ms~1min 后恢复正常的现象。在对电压跌落进行检测时一般都需要检测起止时刻、相位跳变、跌落深度这三个特征…

小啊呜产品读书笔记001:《邱岳的产品手记-03》第04+05讲 如何当好AI时代的产品经理 06讲 产品案例分析·TheGuardian的文本之美

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-03》第0405讲 如何当好AI时代的产品经理 & 06讲 产品案例分析TheGuardian的文本之美一、今日阅读计划二、泛读&知识摘录1、04讲 如何当好AI时代的产品经理&#xff1f;&#xff08;学习篇&#xff09;2、05讲 如何当…

07-服务管理-02-yum常用命令和yum源

文章目录1. yum常用命令1.1 安装卸载服务- 安装- 升级- 卸载- 清空缓存- 只下载不安装1.2 查看- 查看yum库- 列出所有包- 查看包信息- 查看文件所在包1.3 包组的使用2. 指定yum源3. 常用yum源1&#xff09;epel源2&#xff09;163源3&#xff09;阿里源4&#xff09;清华源4. y…

盘点实验室的----FITC-透明质酸;FITC-HA不同透明质酸分子量修饰

FITC(异硫氰酸荧光素)是一种胺活性衍生物的荧光染料&#xff0c;FITC 具有广泛的应用&#xff0c;作为抗体和其他探针标记&#xff0c;用荧光显微镜&#xff0c;流式细胞仪、免疫荧光方法如 ELISA 和 Western印迹实验。异硫氰酸荧光素(FITC)具有永久性标记生物分子的独特检测性…

【C++】构造函数、析构函数、拷贝构造函数

目录 构造函数 析构函数 拷贝构造函数 C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方…

Nginx下载安装以及简单使用

本文来说下Nginx的下载安装以及常用功能的简单使用 文章目录下载nginx启动nginx关闭nginx下载nginx 下载地址:http://nginx.org/en/download.html 直接下载 nginx-1.18.0.zip&#xff0c;下载后解压&#xff0c;解压后如下 启动nginx 有很多种方法启动nginx (1)直接双击nginx.…

浅谈深度学习中的概率

摘要&#xff1a;本次就和大家聊一聊深度学习中的概率。本文分享自华为云社区《【MindSpore易点通】深度学习中的概率》&#xff0c;作者&#xff1a; chengxiaoli。 为什么会用到概率呢&#xff1f;因为在深度学习中经常会需要处理随机的数据&#xff0c;或者包含随机性的任务…

Java基础之《netty(2)—IO模型、BIO介绍、NIO介绍》

一、IO模型 1、I/O模型简单的理解&#xff1a;就是用什么样的通道进行数据的发送和接收&#xff0c;很大程度上决定了程序通信的性能。 2、Java共支持3种网络编程模型I/O模式&#xff1a;BIO、NIO、AIO。 3、Java BIO&#xff1a;同步并阻塞&#xff08;传统阻塞型&#xff…

DeepCTR:易用可扩展的深度学习点击率预测算法包

这个项目主要是对目前的一些基于深度学习的点击率预测算法进行了实现&#xff0c;如PNN,WDL,DeepFM,MLR,DeepCross,AFM,NFM,DIN,DIEN,xDeepFM,AutoInt等,并且对外提供了一致的调用接口。 关于每种算法的介绍这里就不细说了&#xff0c;大家可以看论文&#xff0c;看知乎&#x…

做平台没有会员流量?没有客户留存?不妨来试试这个!超A分享购

商业模式最具有拓客引流的创新新模式&#xff0c;当属是“分享购”商业模式。 分享购是一个能够融合总流量与资源的商业运营模式&#xff0c;能够完成全部生态布局的应用&#xff0c;通过融合自营品牌、供应链选品、CPS生活服务等优质&#xff0c;可以实现“交易、共享”的新型…

Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务调用

目录一、Ribbon负载均衡服务调用概述Ribbon负载均衡演示RestTemplateRibbon核心组件IRuleRibbon负载均衡算法原理&#xff08;RoundRobinRule原理&#xff09;源码&#xff08;RoundRobinRule&#xff09;手写负载算法二、OpenFeign服务接口调用概述使用步骤OpenFeign超时控制O…

鉴源论坛 · 观模丨浅谈随机测试

作者 | 黄杉 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 首发 | 鉴源论坛 观模 01 什么是随机测试 &#xff08;Random Testing&#xff09; 随机测试是一种使用随机、相互独立的程序输入来对计算机程序进行测试的黑盒软件测试&#xff08;在完全忽…

疫情联防联控解决方案-最新全套文件

疫情联防联控解决方案-最新全套文件一、建设背景1、疫情防控数据涉及多方&#xff0c;共享难2、疫情数据使用实时性和准确性差3、敏感信息容易泄露和滥用4、建设成本高&#xff0c;后续扩展性弱二、思路架构三、建设方案四、获取 - 疫情联防联控全套最新解决方案合集一、建设背…

OA系统必备的五个基本要素

如果你正在寻找可以将工作流程提升到一个新水平的OA系统&#xff08;或办公自动化系统&#xff09;&#xff0c;请查看其是否具备以下五个基本功能。 1、简单的工作流设计器 一个现代的OA系统应该从业务用户的角度出发。 当你坐下来试用一个OA系统时&#xff0c;先从制定自…

spring中使用getBean获取ioc容器创建的对象常见异常

1、获取bean对象的三种基本方式 0、前提准备 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat…

线性代数 --- 投影Projection 五(投影矩阵的性质)

投影矩阵的性质 1&#xff0c;投影矩阵不可逆。 行列式的值为0&#xff0c;条件数无穷大&#xff0c;说明该矩阵不可逆是一个奇异矩阵singular matrix。 同样&#xff1a;行列式的值为0&#xff0c;条件数趋近于无穷大&#xff0c;说明该矩阵不可逆是一个奇异矩阵singular matr…

C# async / await 用法

目录 一、简介 二、异步等待返回结果 三、异步方法返回类型 四、await foreach 五、Task.Delay 结束 一、简介 await 运算符暂停对其所属的 async 方法的求值&#xff0c;直到其操作数表示的异步操作完成。 异步操作完成后&#xff0c;await 运算符将返回操作的结果&…