[树形DP] 最长乘积链

题目

1.最长乘积链 - 蓝桥云课 (lanqiao.cn)

初始思路

对问题进行分析,对每个点dfs去求走不同路的最远距离与次远距离求乘积,时间复杂度为O(n^2)

看了答案怎么弄的优化

解题思路

总的来说

预处理(对每个结点的信息进行统计),预处理完后对所有节点遍历去求乘积最大值

在确定树的拓扑结构后单独求一个节点的最远距离时,会在该树上去比较得到如下路径:

  1. 从当前节点往下,直到子树中某个节点的最长路径。
  2. 从当前节点往上走到其父节点,再从其父节点出发且不回到该节点的最长路径。

也就是先向上走与先向下走。两个方向上的最长路径相乘就是答案。

每个合法节点能贡献二个乘积,向下走的最远距离乘次远距离和向上走的最远距离乘向下走的最远距离。

处理次大值的原因是:

当我们求向上走的最大值时,原理为我到父结点的距离加上父结点到别的点的最远距离,如果父结点到别的点的最远距离经过我时则不能使用,此时就得变成我到父结点的距离加上父结点到别的点的次远距离。因为别一个乘积为从父到根的距离不一定是最优的。

树形DP

我们在此引入 树形DP 解题:

  1. 指定任意一个根节点。
  2. 一次dfs 遍历,统计出每个点向下走的最大值与次大值,以及最大值下去的方向与次大值下去的方向,最大值和次大值走的不是同一方向。
  3. 一次 dfs 遍历,统计出先向上走的最大值。

最大值与次大值更新原理为:当前结点到子节点的距离加上子节点到叶子结点的最远距离,我们对这些子结点求最大值与次大值即可

整体思路

标注:

  • 如何记录方向:记录以 i 出发的最近子节点是什么

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;const int N = 100010;
vector<pair<int, int>> g[N];
int d1[N], d2[N], up[N], p1[N], p2[N];
int n, m, k;void dfs1(int u, int f) {for (auto v : g[u]) {if (v.first == f) continue;dfs1(v.first, u);  //先到叶子后转移if (d1[v.first] + v.second >= d1[u]) {  //叶子的d1d2都是0,如果可转移则相加转移d2[u] = d1[u];p2[u] = p1[u];d1[u] = d1[v.first] + v.second;p1[u] = v.first;} else if (d1[v.first] + v.second > d2[u]) {d2[u] = d1[v.first] + v.second;p2[u] = v.first;}}
}void dfs2(int u, int f) {for (auto v : g[u]) {if (v.first == f) continue;if (p1[u] == v.first)up[v.first] = v.second + max(up[u], d2[u]);elseup[v.first] = v.second + max(up[u], d1[u]);dfs2(v.first, u);}
}int main() {int t = 1;for (int zu = 1; zu <= t; zu++) {cin >> n;for (int i = 1; i <= n - 1; i++) {int a, b, c;cin >> a >> b >> c;g[a].push_back(make_pair(b, c));g[b].push_back(make_pair(a, c));}dfs1(1, -1);dfs2(1, -1);long long res = 0;for (int i = 1; i <= n; i++) {res = max(res, max(1LL * d1[i] * d2[i], 1LL * d1[i] * up[i]));}cout << res << endl;}return 0;
}

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

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

相关文章

AWS无服务器直播解决方案

随着媒体系统的发展&#xff0c;越来越多的直播客户想要一个即开即用的平台&#xff0c;在不需要管理和运维底层资源的同时使用一站式的媒体平台。九河云对多家云厂商有所了解及有一定合作&#xff0c;下面将按客户的需求介绍aws的无服务器直播解决方案。 架构概述&#xff1a…

Flutter插件开发指南02: 事件订阅 EventChannel

Flutter插件开发指南02: 事件订阅 EventChannel 视频 https://www.bilibili.com/video/BV1zj411d7k4/ 前言 上一节我们讲了 Channel 通道&#xff0c;但是如果你是卫星定位业务&#xff0c;原生端主动推消息给 Flutter 这时候就要用到 EventChannel 通道了。 本节会写一个 1~…

HarmonyOS 权限 介绍

权限说明 权限等级 根据权限对于不同等级应用有不同的开放范围&#xff0c;权限类型对应分为以下三种&#xff0c;等级依次提高。 normal权限 normal 权限允许应用访问超出默认规则外的普通系统资源。 这些系统资源的开放&#xff08;包括数据和功能&#xff09;对用户隐私以及…

Unity编辑器扩展之是否勾选Text组件BestFit选项工具(此篇教程也可以操作其他组件的属性)

想要批量化是否勾选项目预制体资源中Text组件BestFit属性&#xff08;此篇教程也可以操作其他组件的属性&#xff0c;只不过需要修改其中对应的代码&#xff09;&#xff0c;可以采用以下步骤。 1、在项目的Editor文件中&#xff0c;新建一个名为TextBestFitBatchProcessor的…

日常遇到Maven出现依赖版本/缓存问题通用思路。

Maven依赖错误联想 明明自己的工程是直接从大佬哪里拉下来的&#xff0c;并且自己的setting文件也是没有问题&#xff0c;可是自己偏偏编译有问题。这里介绍一种通用解决方案&#xff0c;仅供参考。 前置排查确认 我遇到原因是在JDK升级过程中遇到的&#xff1a; java.lang.…

Linux篇:指令

一 基本常识&#xff1a; 1. 文件文件内容文件的属性 2. 文件的操作对文件内容的操作对文件属性的操作 3. 文件的类型&#xff1a; d&#xff1a;目录文件 -&#xff1a;普通文件 4. 指令是可执行程序&#xff0c;指令的代码文件在系统的某一个位置存在的。/u…

Linux---进程间通讯(上)

一、进程间通讯的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff0…

pytorch使用文档

torch 张量操作&#xff08;torch&#xff09; torch.tensor(): 用数据创建一个 torch.Tensor 对象。torch.from_numpy(): 从 numpy 数组创建张量。torch.zeros(), torch.ones(), torch.rand(), torch.randn(): 创建具有特定形状的全0、全1、均匀分布随机、标准正态分布随机张…

css3实现无缝滚动,鼠标经过暂停

js也可以实现&#xff0c;但css3更加的平滑和资源占用更少。下面是具体代码&#xff0c;动画要单独用一个类名&#xff0c;否则暂停估计不会生效&#xff1a; 原理&#xff1a;动画向上移动&#xff0c;目标完全消失后&#xff0c;从头开始。js实现是获取消失的部分&#xff0…

分享10款自媒体人常用ai写作工具,总有一款适合你 #其他#AI写作

你是否因为写作困顿而感到沮丧&#xff1f;是不是希望能够找到一个能给你提供无限灵感和提高创作效率的利器&#xff1f;AI写作助手就是你的绝佳选择&#xff01;现在我向大家推荐几款好用的AI写作助手&#xff0c;它们将让你的创作之旅更加流畅、富有创意。 1.七燕写作 这是一…

十二、通过色彩空间转换进行更换图片背景

项目功能实现&#xff1a;对一张白色背景的图片进行更换成蓝色背景&#xff0c;类似抠图更换背景操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 inrange.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class INRANGE{ public:v…

入门指南:Element UI 组件的安装及使用

随着前端开发技术的不断发展&#xff0c;越来越多的开发者选择使用现成的 UI 组件库来加速项目开发并提升用户体验。其中&#xff0c;Element UI 作为一款基于 Vue.js 的组件库&#xff0c;备受开发者们的青睐。本篇博客将为大家介绍如何安装并使用 Element UI 组件&#xff0c…

华为OD机试真题-围棋的气-2023年OD统一考试(C卷)---python代码

题目&#xff1a; 代码&#xff1a; """ # 输入&#xff1a;2的倍数 第一个为行号 0-18 第二个为列号 0-18第一行为黑色 第二行为白色思路&#xff1a;先求黑色&#xff0c;进行去重棋子的位置&#xff0c;再求白色 逐个棋子求坐标。 """ d…

pytorch和tensorflow比较以及安装使用tensorflow

google brain tensorflow facebook ai pytorch TensorFlow支持Python、C、Java和Go等编程语言&#xff0c;而PyTorch主要使用Python pytorch有c语言版本性能完全没问题可以用python开发测试用c语言版本训练和部署 在TensorFlow中&#xff0c;模型的定义和计算图建立在静态图…

git重新提交commit

在Git中重新提交commit&#xff0c;通常是指修改最近的提交或者更早的提交。以下是一些常用的方法来重新提交commit&#xff1a; 修改最后的提交 如果你只是想修改最后一次提交的信息&#xff08;比如提交信息写错了&#xff09;&#xff0c;你可以使用&#xff1a; bashCopy…

OpenLayers6入门,如何销毁已经创建好的OpenLayers地图容器

专栏目录: OpenLayers入门教程汇总目录 前言 本章介绍如何销毁已经创建好的OpenLayers地图容器。 在某些场景下,可能会需要销毁之前的地图,重新创建新的地图的需要,因此本章介绍一下在开始创建地图前如何先销毁之前的地图的功能。 二、依赖和使用 "ol": &qu…

用CSS3画一个三角形

<style> .up{width:0;height:0;border: 100px solid transparent;border-top: 100px solid red;/*红色*/ } .down{width:0;height:0;border: 100px solid transparent;border-bottom: 100px solid blue;/*蓝色*/ } .left{width:0;height:0;border: 100px solid transpare…

【爬虫JS逆向-工具篇】浏览器内存漫游加密参数Hook实战教程

文章目录 1. 写在前面2. 环境搭建2. 加密定位实战 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关…

PCI:电脑里的“交通警察”,让数据有序流动!

亲爱的朋友们&#xff0c;你们好&#xff01;我是香蕉&#xff0c;今天我要带你们一起走进一个神秘而重要的技术领域——PCI&#xff08;Peripheral Component Interconnect&#xff09;。这个名字听起来可能有点拗口&#xff0c;但实际上&#xff0c;PCI就像是电脑里的“交通警…

JWT 重点讲解

JWT 重点讲解 文章目录 JWT 重点讲解1. JWT 是什么2. JWT 的组成2.1 第一部分 HEADER2.2 第二部分 PAYLOAD2.3 第三部分 SIGNATURE 3. JWT 在线生成与解析4. JWT 的特点4.1 无状态4.2 可自定义4.3 扩展性强4.4 调试性好4.5 安全性取决于密钥管理4.6 无法撤销4.7 需要缓存到客户…