[ACM学习]自上而下树形dp

问题引入

设置dp状态,相比于更容易出错的贪心更...不易出错。

状态设计

如果选择父结点,就会使孩子结点不能被选择,我们会多开一维的dp,用来标记该点是否被标记过。

以1点举例,f[1][0]为不选它的状态,那么它的子结点2 3 是可选可不选的,所以是 max(f[2][0],f[2][1])+max(f[3][0]+f[3][1]) ,在子结点的两个状态里挑最大值,并且子结点间没有限制,所以直接相加。

f[1][1]=f[2][0]+f[3][0]

所以这题的总体思路是:从叶子结点开始,dp[v][0]=0 dp[v][1]=a_v,并且到达根。

最后结果在 dp[root][0] dp[root][0]里挑一个max

void dfs(int u, int fa)
{
    for (int i = head[u]; i; i = edge[i].nex)
    {
        int v = edge[i].to;
        if (v != fa)
            continue;
        dfs(v, u);
        f[u][0] += max(f[v][0], f[v][1]);
        f[u][1] += f[v][0];
    }
    return ;
}

在这里解释一下自上而上:父结点的状态转移方程是会受到孩子状态值的影响。算法进行的方向还是从叶子计算到根。

问题二

状态设计

二维可以解决,将是否选择这个点并入体积里(选了这个点即为多这个点的体积)

状态转移是什么样的?可以把一个子树的几个孩子看成是几个物品,用类似于背包问题进行状态转移。

当前结点u在体积v1下,由体积v1-v2下加上某一孩子的v2体积下价值与它原来的值进行大小对比。所以我们会对v1 v2进行枚举。

虽然我们类比了01背包,但是和01背包问题相比,某一个子树的体积不是某个定值,而是会从0到最大限度进行枚举。

void dfs(int u, int fa)
{
    memset(f[u], -0x3f, sizeof f[u]);
    if (v[u] <= V)
        f[u][v[u]] = w[u];  //把当前结点放进去,以u为根的子树里,还只放入了结点u
    for (int i = head[u]; i; i = edge[i].nex)   //枚举每一个子树
    {
        int v = edge[i].to;
        if (v == fa)
            continue;
        dfs(v, u);  
   //从叶子开始,
    //,每个孩子结点看成不同的物品,进行01背包
        vector<int> nf(f[u], f[u] + V + 1);  //当前子树的背包过程,用来转移
        for (int v1 = 0; v1 <= V; v1 ++)   //含义:在放入这个子树前,已使用的体积
        {
            for (int v2 = 0; v1 + v2 <= V; v2 ++ )  //放入v2后不能超过V
            {
                nf[v1 + v2] = max(nf[v1 + v2], f[u][v1] + f[v][v2]);
            }
        }
        for (int v = 0; v <= V; v ++ )
            f[u][v] = nf[v];
    }
    return ;
}

问题二进阶

siz[u] 是指,把包含u在内,u为根的子树,把所有权值都加上,得到的和。

虽然还是两层for,但是如果在每个结点都体积为1的情况下,相当于是把以u为子树的每个结点两两进行比较。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell脚本概述

将命令写到脚本里面&#xff0c;利用路径或者解释器去执行。简要来说脚本其实就是命令的集合。 例如&#xff1a;echo $&#xff1f; 自定义变量&#xff0c;查看上次命令执行是否正确 linux常用的shell 脚本的构成&#xff1a; 1.解释器 &#xff08;脚本是用什么语言写的…

【数据结构与算法】3.顺序表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

FPGA经典书籍分享

推荐一系列FPGA开发方面的书&#xff0c;这些书看完的话对你的FPGA技能会有很大的帮助。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 内容简介 本书系统论述了新一代FPGA设计套件Vivado的性能、使用方法以及FPGA的开发方法。全书内容包括Vivado设计…

Pyside6在Pycharm下安装和使用

目录 一&#xff1a;安装 二&#xff1a;使用 一&#xff1a;安装 打开Pycharm编辑器&#xff0c;file-setting里Python解释器&#xff0c;点击小号&#xff0c;添加模块&#xff0c;搜索Pyside6,安装 安装报错&#xff0c;可能是默认的库安装超时&#xff0c;用其他的源 p…

Conda python管理环境environments 三 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通 1. Activating an environment激活环境 激活环境…

chrome提升搜索效率的快捷方法

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

企业微信开发:客户端调试

开启客户端调试 按照下面官网的说明操作&#xff0c;就可以开启客户端调试了。 官网文档链接&#xff1a;企业微信开发者中心&#xff1a;常见问题 - FAQ - 客户端调试 进入调试模式 进入方式&#xff1a;Ctrl Alt Shift D 按快捷键 Ctrl Alt Shift D&#xff0c;进入…

代理设计模式JDK动态代理CGLIB动态代理原理

代理设计模式 代理模式&#xff08;Proxy&#xff09;&#xff0c;为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出&#xff0c;通过代理模式&#xff0c;客户端访问接口时的实例实际上是Proxy对象&#xff0c;Proxy对象持有RealSubject的引用&am…

内网穿透的应用-使用Docker搭建一个Wiki.Js知识库系统并实现分享他人远程创作

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

Consul使用详解

简介 Consul是一个由HashiCorp公司开发的开源软件&#xff0c;其发展历程可以概括为以下几个阶段&#xff1a; 初期阶段&#xff08;2014-2015年&#xff09;&#xff1a;Consul最初发布于2014年5月&#xff0c;这个版本是基于Go语言开发的&#xff0c;并提供了诸如服务发现、…

【百面机器学习】读书笔记(一)

本文系列主要作用就是读书笔记&#xff0c;自己看的话比较杂&#xff0c;没怎么归类过&#xff0c;所以现在跟着这个分类走一遍。本文主要内容为前两章&#xff0c;特征工程和模型评估。 如果我想起一些相关的内容也会做适当的补充&#xff0c;主打就是一个intuition&#xff…

深度学习算法应用实战 | DINOv2 图像相似度实战

特征提取简介 什么是特征提取 特征提取器负责为音频或视觉模型准备输入特征。包括从序列中提取特征&#xff0c;例如&#xff0c;对音频文件进行预处理以生成对数梅尔频谱图特征。以及从图像中提取特征&#xff0c;例如裁剪图像文件&#xff0c;还包括填充、归一化以及转换为N…

Vue+Element(el-switch的使用)+springboot

目录 1、编写模板 2、发送请求 3、后端返数据 1.Controller类 2.interface接口&#xff08;Service层接口&#xff09; 3.Service&#xff08;接口实现&#xff09; 4.interface接口&#xff08;Mapper层接口&#xff09; 5.xml 6.效果 4、el-switch属性 1、编写模板 …

CSDN COC西安城市开发者社区2023年度线下聚会

1. 活动背景 CSDN始终致力于促进城市区域内尖端新型技术开发者交流&#xff0c;提供开放自由的切磋平台。在这个充满挑战和机遇的一年即将结束之际&#xff0c;通过本次聚会&#xff0c;汇聚西安本地各行各业的开发者朋友&#xff0c;回顾过去一年城市社区的成就和收获&#x…

一文(10图)了解Cornerstone3D核心概念(万字总结附导图)

Cornerstone3D介绍 Cornerstone3D是一个专门为处理三维医学影像而设计的JavaScript库。 它是Cornerstone项目的一部分&#xff0c;旨在为医学影像社区提供高性能、可扩展且易于使用的开源Web工具&#xff0c;专注于提供交互式的3D医学图像浏览体验&#xff0c;适用于多种医学…

不想要网页默认的右键菜单栏,怎么封装一个可以自定义的右键菜单组件?

说在前面 &#x1f388;网页的功能和用途可能各不相同&#xff0c;在传统右键菜单栏中无法满足每个用户的个性化需求。通过自定义右键菜单栏&#xff0c;用户可以根据自己的需求添加、调整和删除菜单选项&#xff0c;以实现个性化定制。通过自定义右键菜单栏&#xff0c;可以为…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

在本教程的前两部分&#xff0c;我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件&#xff0c;以及使用 Helm 在 Kubernetes 上安装 Prometheus。 在今天的教程中&#xff0c;我们将为你介绍以下内容&#xff1a; 安装 Grafana&#xff1b;集成 Promethe…

centos 启动nacos pg版本

背景&#xff1a;支持国产化需求&#xff0c;不再使用mysql 1.修改插件 git clone https://github.com/wuchubuzai2018/nacos-datasource-extend-plugins.git cd nacos-datasource-extend-plugins/nacos-postgresql-datasource-plugin-ext mvn package编译成功后&#xff0c;…

Docker(七)使用网络

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 一、外部访问容器 容器中可以运行一些网络应用&…

代码随想录算法训练营29期|day27 任务以及具体安排

39. 组合总和// 剪枝优化 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> res new ArrayList<>();Arrays.sort(candidates); // 先进行排序backtracking(res, new ArrayList&…
最新文章