树形DP分析

news2024/10/6 23:39:44

树形dp


简单来说树形 d p 就是在树上做 d p 罢了 简单来说树形dp就是在树上做dp罢了 简单来说树形dp就是在树上做dp罢了
树嘛,就要符合除了根节点外每个节点只有一个父节点 树嘛,就要符合除了根节点外每个节点只有一个父节点 树嘛,就要符合除了根节点外每个节点只有一个父节点
然后分析 d p 的时候,不再是线性的前几的什么属性那种线性术语了 然后分析dp的时候,不再是线性的前几的什么属性那种线性术语了 然后分析dp的时候,不再是线性的前几的什么属性那种线性术语了
而是以 i 为根节点的树的各种属性 而是以i为根节点的树的各种属性 而是以i为根节点的树的各种属性
状态转移也从原本的前 i − 1 到前 i 个转移 状态转移也从原本的前i-1到前i个转移 状态转移也从原本的前i1到前i个转移
而是 u 的子树向 u 为根的树转移 而是 u的子树向u为根的树转移 而是u的子树向u为根的树转移


上几道例题具体分析
例题一

思路

在这里插入图片描述

AC代码


#include<bits/stdc++.h>

using namespace std;

const int N = 1e4 + 10;

int h[N], e[N], w[N], ne[N], idx;
bool st[N];
int n;
int f[N][3]; //1:最长 0 次长
int res = -0x3f3f3f3f;

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

void dfs(int u)
{
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        dfs(j);
        if(f[j][1] + w[i] >= f[u][1]){
            
            f[u][0] = f[u][1];
            f[u][1] = f[j][1] + w[i];
        }
        else if(f[j][1] + w[i] > f[u][0])
        {
            f[u][0] = f[j][1] + w[i];
        }
    }
}

int main()
{
    cin >> n;
    memset(h, -1, sizeof(h));
    for(int i = 1; i <= n - 1; i ++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
        st[b] = true;
    }
    int root = 1;
    while(st[root]) root ++;
    dfs(root);
    
    for(int i = 1; i <= n; i ++)
    {
        res = max(res, f[i][0] + f[i][1]);
    }
    
    cout << res << endl;
    
    return 0;
}

例题2
在这里插入图片描述


#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;

int h[N], e[N<<1], w[N<<1], ne[N<<1], idx;
int n;
int down1[N], down2[N], up[N], best[N], second[N];

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

void dfs_d(int u, int fa)
{
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if(j == fa) continue;
        dfs_d(j, u);
        if(down1[j] + w[i] >= down1[u])
        {
            down2[u] = down1[u];
            second[u] = best[u];
            best[u] = j;
            down1[u] = down1[j] + w[i];
        }
        else if(down1[j] + w[i] > down2[u])
        {
            down2[u] = down1[j] + w[i];
            second[u] = j;
        }
    }
}

void dfs_u(int u, int fa)
{
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if(j == fa) continue;
        if(j == best[u])
        {
            up[j] = max(up[u], down2[u]) + w[i];
        }
        else
        {
            up[j] = max(up[u], down1[u]) + w[i];
        }
        dfs_u(j, u);
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    cin >> n;
    for(int i = 1; i <= n - 1; i ++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c), add(b, a, c);
    }
    dfs_d(1, -1);
    dfs_u(1, -1);
    int res = 1e9;
    for(int i = 1; i <= n; i ++)
    {
        res = min(max(down1[i], up[i]), res);
    }
    cout << res << endl;
    return 0;
}

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

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

相关文章

# 从车灯模组的角度聊聊信息安全需求

文章目录 1. 前言2.信息安全需求2.1 硬件安全2.1.1 接口安全2.1.2 主板安全2.1.3 芯片安全 2.3 系统安全2.3.1 代码安全2.3.2 软件读保护2.3.3 安全启动2.3.4 安全升级2.3.5 安全诊断 2.4 通信安全2.5 数据安全 3. 安全启动流程3.1 基于签名技术的安全启动方案3.2 基于对称签名…

netty源码阅读--处理客户端请求

背景 netty是一个非常成熟的NIO框架&#xff0c;众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程&#xff0c;重在理解netty的关键如&#xff1a;如何启动&#xff0c;如何接受网络数据、netty的内存管理机制以及编解码器等&am…

Python学习笔记--面向对象

未完待续。。。。。 &#xff08;一&#xff09;面向对象的基本概念 我们之前学习的编程方式就是面向过程的 面相过程和面相对象&#xff0c;是两种不同的编程方式 对比面向过程的特点&#xff0c;可以更好地了解什么是面向对象 1.1过程和函数 过程是早期的一个编程概念 过程…

4.3 分段低次插值

学习目标&#xff1a; 如果我要学习分段低次插值&#xff0c;我可能会采取以下几个步骤&#xff1a; 学习插值的基本概念和方法 在学习分段低次插值之前&#xff0c;我需要先掌握插值的基本概念和方法&#xff0c;例如拉格朗日插值、牛顿插值和内维尔方法等。这些基础知识可…

C#调用C++封装的SDK库(dll动态库)——上

C#调用C封装的SDK库(dll动态库)——上 一、C封装库 通过前几篇文章&#xff0c;我们封装了C的动态DLL库&#xff0c;有Qt版的&#xff0c;有C版的&#xff0c;当然还有介绍了Pimpl模式在SDK封装中的使用&#xff1a; Qt创建SDK VS创建SDK Pimple在SDK封装中的应用 但是&a…

关于逻辑回归的几个函数

写作业时重新理了下&#xff0c;如果有问题欢迎指正&#xff01; 说是回归&#xff0c;其实就是个分类&#xff0c;用【0&#xff0c;1】标记结果y是录取还是录取&#xff0c;而影响结果y的就是X(x0,x1,…xn-1)。怎么判断结果y是0还是1用到的是逻辑回归函数&#xff08;也叫假…

java企业级信息系统开发学习笔记05 初探Spring AOP

文章目录 一、学习目标二、Spring AOP&#xff08;一&#xff09;AOP基本含义&#xff08;二&#xff09;AOP基本作用&#xff08;三&#xff09;AOP和OOP对比&#xff08;四&#xff09;AOP使用方式&#xff08;五&#xff09;AOP基本概念 三、采用配置方法使用AOP&#xff08…

windows下Tomcat安装

目录 1.安装java环境 2.配置Tomcat环境变量 3.安装服务 4.启动前修改配置文件 &#xff08;1&#xff09;设置tomcat端口 &#xff08;2&#xff09;设置临时日志等文件夹的位置 5.放入应用 6.启动Tomcat服务 1.安装java环境 安装tomcat版本对应的JDK 比如&#xff1a;…

Mysql的简介和选择

文章目录 前言一、为什么要使用数据库 数据库的概念为什么要使用数据库二、程序员为什么要学习数据库三、数据库的选择 主流数据库简介使用MySQL的优势版本选择四、Windows 平台下安装与配置MySQL 启动MySQL 服务控制台登录MySQL命令五、Linux 平台下安装与配置MySQL总结 前言…

Redis 分布式锁解决方案

1 背景 我们日常在电商网站购物时经常会遇到一些高并发的场景&#xff0c;例如电商 App 上经常出现的秒杀活动、限量优惠券抢购&#xff0c;还有我们去哪儿网的火车票抢票系统等&#xff0c;这些场景有一个共同特点就是访问量激增&#xff0c;虽然在系统设计时会通过限流、异步…

设计模式:行为型模式 - 责任链模式

文章目录 1.概述2.结构3.案例实现4.优缺点5.源码解析 1.概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经…

链表方式实现栈和队列(C语言)

目录 栈 队列 栈 栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它是一种线性数据结构&#xff0c;具有后进先出&#xff08;Last In First Out, LIFO&#xff09;的特点。栈可以看作是一个容器&#xff0c;只能在容器的一端进行插入和删除操作&#xff0c…

【12 Filter 学习笔记】

Filter 笔记记录 1. Filter 过滤器2. Filter介绍3. FilterChain3. Filter 过滤器的使用4. 过滤器使用细节5. Filter的声明周期6. FilterConfig7. 过滤器五种拦截行为 1. Filter 过滤器 2. Filter介绍 3. FilterChain 3. Filter 过滤器的使用 import javax.servlet.ServletExcep…

SQL:group by 的用法及其与 over(partition by)的区别

1.group by的作用 根据一定的规则将一个数据集划分成若干个小区域&#xff0c;然后针对每个区域进行数据处理。即分组查询&#xff0c;一般是和聚合函数配合使用。 重点说明&#xff08;重要&#xff09;&#xff1a; 如果用Select选择某个字段&#xff0c;那么这个字段要么在G…

cpld 模拟iic 访问原理实现

1,因为 单片机访问sfp和ds125占用了6路iic,但是现在还有lm75需要使用iic访问,所以要么使用iic片选,但是扩展iic需要的总线不多,这里要么考虑使用互斥锁,也就是使用同一路iic时候加锁,使用完成后就释放。也可以考虑使用cpld模拟iic来访问lm75。 2,cpld 软件模拟iic总线原理…

初识MySql数据库

​​​​使用MySql数据库的英文打字小游戏: 英文打字小游戏 MySql学习 1&#xff1a;MySql是关系型数据库&#xff0c;跨平台的。Sql Server是微软出的啊。 2&#xff1a;Web服务器端运行原理图。 Web服务器&#xff1a;网页资源的获取 游戏服务器&#xff1a;游戏数据的同步…

WEB通讯技术。前端实现SSE长连接,nodejs+express搭建简单服务器,进行接口调试,通过curl请求数据

描述 长连接&#xff08;Keep-Alive&#xff09;是一种HTTP/1.1的持久连接技术&#xff0c;它允许客户端和服务器在一次TCP连接上进行多个HTTP请求和响应&#xff0c;而不必为每个请求/响应建立和断开一个新的连接。长连接有助于减少服务器的负载和提高性能。 长连接的HTTP请…

《Android性能优化》一次失败的启动速度优化

正文 在优化APP启动之前&#xff0c;我们首先需要知道&#xff0c;APP启动时究竟发生了什么&#xff0c;才能有的放矢的优化。 APP的启动过程 APP的启动过程就是指&#xff0c;在手机屏幕上点击某个APP的图标&#xff0c;到APP的首页显示在用户面前的过程。 一般APP的启动过…

Web自动化测试简介及web自动化测试实战交教程

一、认识web自动化测试 1.什么是自动化测试&#xff1f; 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段&#xff0c;按照测试人员的预定计划对软件产品进行自动化测试&#xff0c;他是软件测试的一个重要组成部分&#xff0c;能够完成许多手工测试无法完成或…

Linux网络服务----ftp

文章目录 一 、什么是FTP1.1 Standard模式&#xff08;主动模式&#xff09;1.2 Passive模式&#xff08;被动模式&#xff09; 二 、FTP的作用及工作原理2.1 FTP的作用和模式以及通信方式2.2 FTP的工作原理 三、搭建和配置FTP服务3.1 设置匿名用户访问的FTP服务(最大权限)3.2 …