【Acwing285】没有上司的舞会(树形dp)题目笔记

news2024/9/24 21:27:33

题目描述

 

 题目分析

首先来看状态表示:

f[u][1]:所有从以u为根的子树中选择,并且不选u这个点的情况之下的最大指数

f[u][0]:所有从以u为根的子树中选择,并且选择u这个点的情况之下的最大指数

然后看状态计算:

假如选择u这个点,那么u的子节点必然不能选择,得出状态转移式子:

f[u][1]=happy[u]+\sum f[k][0]  其中k是u的所有子节点

假如没有选择u这个点,那么u的子节点可以选择也可以不选择,到底选不选,取决于哪种情况下的指数大,易得状态转移式子:

f[u][0]=\sum max(f[k][0],f[k][1])

时间复杂度分析:

只需要从父节点开始遍历树上所有结点的子节点,而且已经遍历过的不用重复,而子节点的数量为树的边数n-1,故为O(n)

最后,在acwing中这道题目的题解下面,y总用一句话解释了dfs和dp的区别,一语道破梦中人:

 代码及注释

#include<iostream>
#include<cstring>
using namespace std;
const int N=6010;
int happy[N];
int e[N],ne[N],h[N],idx;
int f[N][2];
int n;
bool has_father[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);//目的是给f[k][1]和f[k][0]赋值,其中k是j以及j所有子孙结点
        f[u][1]+=f[j][0];
        f[u][0]+=max(f[j][0],f[j][1]);
    }
}
int main()
{
    cin>>n;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++)cin>>happy[i];
    for(int i=1;i<n;i++)
    {
        int a,b;
        cin>>a>>b;
        has_father[a]=true;
        add(b,a);
    }
    int root=1;
    while(has_father[root])root++;//寻找根节点
    dfs(root);
    cout<<max(f[root][1],f[root][0])<<endl;
    return 0;
}

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

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

相关文章

3 自制一个集群分发脚本

1. 随便取了一个名字&#xff1a;xsync 2. 在一个配置环境变量的目录下&#xff0c;我是放在了/opt/software下&#xff0c;这个路径我是配置了环境变量的。 3. 编辑脚本&#xff1a;vim xsync #!/bin/bash#1. 判断参数个数 if [ $# -lt 1 ] thenecho Not Enough Arguement!…

【淘宝/天猫】获得淘宝商品详情sku(PC端APP端),关键词搜索商品列表,商品分类等

采集商品详情的主要用途包括&#xff1a; 1. 电商平台运营&#xff1a;电商平台需要收集商品的详细信息&#xff0c;包括商品名称、描述、价格、规格、图片等&#xff0c;以便展示给用户进行购买决策。通过采集商品详情&#xff0c;电商平台可以提供丰富的商品信息给用户&…

openGauss学习笔记-52 openGauss 高级特性-LLVM

文章目录 openGauss学习笔记-52 openGauss 高级特性-LLVM52.1 适用场景52.2 非适用场景52.3 其他因素对LLVM性能的影响52.4 LLVM使用建议 openGauss学习笔记-52 openGauss 高级特性-LLVM openGauss借助LLVM&#xff08;Low Level Virtual Machine&#xff09;提供的库函数&…

语言基础篇1——Python概述,Python是什么?Python能干什么?

概述 简介 Python&#xff0c;计算机高级语言&#xff0c;读作/ˈpaɪθən/&#xff08;英音&#xff09;、/ˈpaɪθɑːn/&#xff08;美音&#xff09;&#xff0c;意为蟒蛇&#xff0c;Python的logo为两条缠绕的蟒蛇 特点 Python以开发效率高而运行效率低著称 应用领域…

Android学习之路(10) Bundle

Bundle的概念理解 Bundle经常出现在以下场合&#xff1a; Activity状态数据的保存与恢复涉及到的两个回调&#xff1a;void onSaveInstanceState (Bundle outState)、void onCreate (Bundle savedInstanceState)Fragment的setArguments方法&#xff1a;void setArguments (Bu…

无可用的防病毒提供方你的设备

今天安装软件时关闭了一下windows的Defender&#xff0c;然后安装后出现下面问题 莫名奇妙我的病毒防护就不能用了 后来请教了老师才知道是安装的软件把我系统设置改了&#xff0c;以后使用一键安装软件要谨慎 解决措施&#xff1a; CMD命令&#xff0c;输入“regedit”&#…

kubernetes/k8s驱逐机制总结篇

概述 k8s的驱逐机制是指在某些场景下&#xff0c;如node节点notReady、node节点压力较大等&#xff0c;将pod从某个node节点驱逐掉&#xff0c;让pod的上层控制器重新创建出新的pod来重新调度到其他node节点。这里也将kube-scheduler的抢占调度纳入到了驱逐的讨论范围内&#…

Kotlin开发笔记:协程基础

Kotlin开发笔记&#xff1a;协程基础 导语 本章内容与书的第十五章相关&#xff0c;主要介绍与协程相关的知识。总的来说&#xff0c;本文将会介绍Kotlin中关于异步编程的内容&#xff0c;主要就是与协程有关。在Kotlin中协程是利用continuations数据结构构建的&#xff0c;用…

【洛谷】P2678 跳石头

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。&#xff08;使用二分需要满足两个条件。一个是有界&#xff0c;一个是单调。 这题的题面&#xff1a;使得选手们在比赛过程中…

RV64函数调用流程分析

RV64函数调用流程分析 1 RV64 函数调用实例2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a函数对应汇…

go vet中的那些检测项

go vet 是 Go 语言自带的一个工具&#xff0c;用于分析 Go 代码中的常见错误和潜在问题。它可以检查代码中可能存在的各种问题&#xff0c;例如&#xff1a; 未使用的变量、函数或包 可疑的函数调用 错误的函数签名 程序中的竞态条件 错误的类型转换等 本文意图指令当前go vet所…

单片机IO模拟串口协议

一、前言 嵌入式硬件平台调试中常用的debug方法是看串口打印定位问题&#xff0c;但有时候会遇到单片机没有串口外设或者串口引脚被占用的情况&#xff0c;这时候也可以在代码里操作空闲的IO输出不同个数的脉冲来达到调试的效果&#xff0c;但是要用逻辑分析仪抓线逐个看波形比…

快速了解:Mybatis-Plus

一、Mybatis-Plus介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高 效率而生。 官网&#xff1a;https://mybatis.plus/ 或 https://mp.baomidou.com/ 文档地址&…

【软件测试】如何用python连接Linux服务器

1.安装paramiko库 pip install paramiko 2.使用paramiko库连接linux #导入库 import paramiko#创建一个sshclient对象 ssh paramiko.SSHClient()#允许连接不在know_host中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接主机 ssh.connect(hostname…

C++模板中的必须要引用typename

1.看一下下面这个函数 但是如果传的是vector<double>或则是list类型,queue类型等等&#xff0c;都是不可以的&#xff0c;有些人就会说了&#xff0c;用模板呗&#xff0c;现在问题就出现了&#xff1a; 为什么会出现这个错误呢&#xff1f; 其实就是编译器不知道你这个…

MySQL索引连环18问!

1. 索引是什么&#xff1f; 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)&#xff0c;它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。数据库索引&#xff0c;是数据库管理系统中一个排序的数据结构&#xff0c;以协助快速查询、更新数…

await Promise内部执行setTimeout定时器,提前clearTimeout,导致卡死的情况分析及解决方案

背景概述 在我们日常开发中&#xff0c;我们常常需要在某个地方暂停某个动作一段时间。这个时候&#xff0c;我们的通常做法是使用setTimeout&#xff0c;配合promise实现。也就是如下代码。 function delay(ms) {return new Promise((resolve, reject) > {setTimeout(() …

redis数据库及其常用数据结构

redis数据库 非关系型数据库 非关系型数据库是什么&#xff1f; 非关系型数据库其实是相对于关系型数据库而言的&#xff0c;关系型数据库中同种数据存储在一张表中&#xff0c;使用表将不同种类的数据进行分隔并且表中的数据如果存在主键&#xff0c;也可以根据主键确定表与…

tableau基础学习1:数据源与绘图

文章目录 读取数据常用绘图方法1. 柱状图2. 饼图3. 散点图4. 热力图 第一部分是一些较容易上手的内容&#xff0c;以及比较常见的可视化内容&#xff0c;包括&#xff1a;柱状图、饼图、散点图与热力图 读取数据 打开界面后&#xff0c;选择数据源之后就可以导入数据&#xf…

【操作记录】CLion 中引入 Gurobi 并使用 C++ 编程

文章目录 一、前言二、具体操作2.1 创建项目2.2 修改编译工具2.3 修改 CMakeLists.txt2.4 修改 main.cpp2.5 运行测试 一、前言 虽然C编程大部分人都会选择使用VS&#xff0c;但是作为 IDEA 的长期用户&#xff0c;我还是比较习惯 JetBrains 风格的编译器&#xff0c;所以就选…