news 2026/7/28 16:30:04

百度之星 Diversity (简单树形dp)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
百度之星 Diversity (简单树形dp)

题意描述:

Diversity

给你一棵n个点的树,对于节点ii,你要给它标上一个[l​i​​,r​i​​]之间的数,

要求所有边两端节点上标的数字的差的绝对值的总和最大。

Input

第一行一个整数T T(1≤T≤5)表示数据组数。对于每组数据格式如下。

第一行一个正整数n(2≤n≤10​5​​)。

接下来n-1行,每行两个正整数 u, v(1≤u,v≤n),表示一条边。

接下来nn行,第ii行两个正整数l​i​​,r​i​​(1 ≤ l​i ​​≤ r​i ​​≤ 10^​9​​)。

Output

对于每组数据,一个整数表示答案。

Sample Input

1 5 1 2 2 3 3 4 4 5 1 5 2 7 7 9 5 8 3 4

Sample Output

16

思路:

树形dp入门题???

开始考虑只要对于每一个节点,要么选择最左端,要么选择最右端点,显然,

这一策略是正确的。

然后假设根节点权值确定,整棵树的状态即确定,然后按照dfs序正向状态转移,

两种状态取较大者作为最优解。(这种贪心策略是不对的,如父节点到子节点的左右

边界差值一致,这时候该怎么选择?)。

但如果逆向考虑就不会有类似问题了,这一点倒是考虑到了,这写出了代码,

但状态转移条件搞错了,具体说错误原因转移时只考虑了父节点和子节点间差值的

大小,而没有加上子节点所在子树的整个权值,所以导致选择出的并不是全局最优解。

代码实现:

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define inf 0x3f3f3f3f using namespace std; const int N = 1e5+100; const int M = 2e5+100; int head[N],ver[M],Next[M],tot; void add(int x,int y) { ver[++tot]=y; Next[tot]=head[x]; head[x]=tot; } long long dp[N][2]; int Left[N],Right[N]; void dfs(int x,int pre) { long long a,b,c,d; for(int i=head[x]; i; i=Next[i]) { int y=ver[i]; if(i==(pre^1))continue; dfs(y,i); a=abs(Left[y]-Left[x]); b=abs(Right[y]-Left[x]); c=abs(Left[y]-Right[x]); d=abs(Right[y]-Right[x]); //转移条件易错 if(dp[y][0]+a>dp[y][1]+b) dp[x][0]+=dp[y][0]+a; else dp[x][0]+=dp[y][1]+b; if(dp[y][0]+c>dp[y][1]+d) dp[x][1]+=dp[y][0]+c; else dp[x][1]+=dp[y][1]+d; } } int main() { #ifdef MYHOME_Wjvje freopen("input.txt","r",stdin); #endif int t,n; scanf("%d",&t); long long ans; while(t--) { tot=1; ans=0; scanf("%d",&n); memset(head,0,sizeof(head)); memset(Next,0,sizeof(Next)); memset(dp,0,sizeof(dp)); for(int i=1; i<n; i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } for(int i=1; i<=n; i++) scanf("%d%d",&Left[i],&Right[i]); dfs(1,0); ans=max(dp[1][0],dp[1][1]); printf("%lld\n",ans); } return 0; }

THE END;

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 16:29:27

Add Binary (67)

这也是经典题。忘了return需要是个string了。 另外忘了a&#xff0c;或者b过界之后&#xff0c;av&#xff0c;bv应该是0. 老了。 最后返回的时候&#xff0c;需要把list里面的数打包成string ‘’.join([str(i) for i in result]). result里面还是数&#xff0c;要重新搞个lis…

作者头像 李华
网站建设 2026/7/28 16:27:39

如何快速搭建私有搜索引擎:SearXNG Docker终极部署指南

如何快速搭建私有搜索引擎&#xff1a;SearXNG Docker终极部署指南 【免费下载链接】searxng-docker The docker-compose files for setting up a SearXNG instance with docker. 项目地址: https://gitcode.com/gh_mirrors/se/searxng-docker 还在为搜索隐私担忧吗&…

作者头像 李华
网站建设 2026/7/28 16:16:37

板卡控制与PLC系统架构对比及工业自动化选型指南

1. 板卡控制的核心架构解析板卡控制系统作为工业自动化领域的重要实现方式&#xff0c;其架构设计直接决定了系统的性能上限和应用边界。与常见的PLC控制系统不同&#xff0c;板卡控制采用模块化硬件架构&#xff0c;通过主控卡与功能扩展卡的协同工作实现精准控制。这种架构特…

作者头像 李华
网站建设 2026/7/28 16:09:34

《极限竞速》车辆涂装生成算法深度解析与性能优化指南

《极限竞速》车辆涂装生成算法深度解析与性能优化指南 【免费下载链接】forza-painter Import images into Forza 项目地址: https://gitcode.com/gh_mirrors/fo/forza-painter Forza Painter 是一款基于几何化算法的开源工具&#xff0c;专门为《极限竞速&#xff1a;地…

作者头像 李华
网站建设 2026/7/28 16:08:52

Linux环境编译Hadoop源码包

hadoop2.7.4centos6.51.准备的资料源码根目录下有个BUILDINT.txt&#xff0c;打开即可看见里面关于编译hadoop的一些环境要求/opt/software/ 存放软件安装包/opt/module/ 存放解压包2.安装JDK(1.8)[rootmaster-node software]# tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt…

作者头像 李华
网站建设 2026/7/28 16:03:05

SpringBoot+Vue景区订票系统适老化设计与实现

1. 项目概述&#xff1a;老年人景区订票系统的设计与实现 这个基于SpringBootVue的景区订票系统&#xff0c;是我去年指导的一个本科毕设项目。不同于常规票务平台&#xff0c;我们专门针对65岁以上老年用户进行了交互优化&#xff0c;在保留完整电商功能的同时&#xff0c;实现…

作者头像 李华