当前位置: 首页 > news >正文

百度之星 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;

http://www.jsqmd.com/news/1281702/

相关文章:

  • 2026南阳商丘信阳梁柱墙体加固房屋改造盘点 - LYL仔仔
  • JavaAgent技术之添加注解
  • 物联网安全:SE050与PIC18F46K22硬件加密方案
  • 2026武进二手设备回收公司推荐|化工厂拆除回收公司哪家好|君东环保一站式回收服务 - geo88
  • 呼叫中心CRM对接实战:API联动原理、来电弹屏、数据同步与业务闭环落地方案
  • 一键备份QQ空间所有历史说说:GetQzonehistory完整指南
  • 免费在线GPX编辑器:3分钟学会专业GPS轨迹编辑技巧
  • PAT甲级 1061 Dating 模拟+字符串
  • AI普通话智能评测系统:核心技术解析与应用实践
  • MYSQL中union的用法
  • Gitee本土化优势与开发者实战指南
  • 3步掌握:国家中小学智慧教育平台电子课本批量下载终极指南
  • Matlab实现两阶段P2G能源转换建模与优化
  • 北京宝藏回收店|合扬名包变现体验:快、稳、值 - 日常财经早知道
  • APP运营如何才能增强用户粘性
  • 元素垂直居中
  • Windows 10运行Android应用终极指南:WSA-Windows-10逆向移植项目详解
  • PAT树的深度优先搜索(dfs)和广度优先搜索(bfs)
  • Karpathy 65行提示词:重构AI编程协作流程,提升代码质量与效率
  • 大模型应用开发的工程化路线:从实验到生产的七个里程碑
  • Google发布网络安全报告 工具堆够用了吗
  • 杭州西湖区漏水检测维修一站式服务 - 本地正规防水补漏公司精选推荐(2026 最新)全域上门:卫生间 / 厨房 / 阳台 / 屋顶渗漏水免砸砖检测维修补漏全攻略 - 吉林同城获客
  • 卡文断更怎么办?10款高效写小说软件横评(含防踩雷指南)
  • 发票、凭证和对账单怎么整理成 Excel?先定义字段,再逐项复核
  • 云南24小时道路救援公司推荐,汽车搭电救援公司哪家好?2026年7月富宁美星服务网点信息核对指南 - geo88
  • 如何高效应用Poppins字体:面向初学者的完整实践指南
  • 通用AI与垂直领域融合的技术实践与优化
  • 张家港上门回收废品公司推荐,汽车电池回收公司哪家好避坑指南:4个常见坑+5条硬标准,2026靠谱公司推荐 - geo88
  • 微前端框架 2026 选型对比:qiankun 的沙箱困境、Module Federation 的共享模型与 wujie 的降级智慧
  • 长鑫上市阿里浮盈超 1600 亿!投资风格转变,从控制转向“在场”