news 2026/4/25 20:13:54

【算法日记】Day 17 动态规划专题——树状DP拓展(DFN序)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法日记】Day 17 动态规划专题——树状DP拓展(DFN序)

Abstract#树形DP#DFS#异或#DFN序

1. 题目

  • 题目:LeetCode 2322. 从树中删除边的最小分数
  • 核心思路:以0为根,DFS预处理每个节点的DFS序(dfn)、子树大小(size)、子树异或值(orx)。随后枚举所有边对,每条边对应一个子树(取两端点中深度较大的那个节点作为子树的根)。对于两条边对应的子树pre和pos(其中pre的DFS序较小),根据它们是否包含关系,计算三个连通块的异或值:
    • 如果pos在pre的子树内,则三个块为:orx[pos]orx[pre] ^ orx[pos](即pre子树中除去pos子树的部分)、orx[1] ^ orx[pre](整棵树减去pre子树)。
    • 否则,三个块为:orx[pre]orx[pos]orx[1] ^ orx[pre] ^ orx[pos]
      最后计算三个值的极差,更新全局最小值。
  • 复杂度:时间复杂度O ( n 2 ) O(n²)O(n2),空间复杂度O ( n ) O(n)O(n)

2. 代码

constintMAXN=10005;classSolution{public:structEdge{intto,next;}graph[MAXN*2];intcnt,head[MAXN]={0};voidadd_edge(intu,intv){graph[++cnt]={v,head[u]};head[u]=cnt;}intdfnCnt;intdfn[MAXN],orx[MAXN],size[MAXN];voidf(vector<int>&nums,introot,intp){inti=++dfnCnt;dfn[root]=i;size[i]=1;orx[i]=nums[root];for(intei=head[root];ei!=0;ei=graph[ei].next){intv=graph[ei].to;if(v==p)continue;f(nums,v,root);orx[i]^=orx[dfn[v]];size[i]+=size[dfn[v]];}}intminimumScore(vector<int>&nums,vector<vector<int>>&edges){cnt=0;for(inti=0;i<edges.size();++i){add_edge(edges[i][0],edges[i][1]);add_edge(edges[i][1],edges[i][0]);}dfnCnt=0;f(nums,0,-1);intans=0x3f3f3f3f;for(intei=0,x,y,pre,pos,sum1,sum2,sum3;ei<edges.size()-1;++ei){x=max(dfn[edges[ei][0]],dfn[edges[ei][1]]);for(intej=ei+1;ej<edges.size();++ej){y=max(dfn[edges[ej][0]],dfn[edges[ej][1]]);if(x<y){pre=x;pos=y;}else{pre=y;pos=x;}sum1=orx[pos];if(pos<pre+size[pre]){sum2=orx[pre]^orx[pos];sum3=orx[1]^orx[pre];}else{sum2=orx[pre];sum3=orx[1]^sum2^sum1;}intminOrx=min(sum1,min(sum2,sum3));intmaxOrx=max(sum1,max(sum2,sum3));ans=min(ans,maxOrx-minOrx);}}returnans;}};

3. 心得

  • DFS序与子树区间:通过DFS序将子树映射为连续区间,便于判断节点间的祖先关系(包含关系)。dfn[u] 和 size[dfn[u]] 确定了子树的区间范围。

  • 异或的性质:利用若a ^ b = c则c ^ a = b,可以通过整棵树异或值与子树异或值快速计算出其他部分的异或值。

  • 枚举策略:枚举所有边对(O(n²)),每条边对应一个子树(取两端点中DFS序较大的节点),通过判断两个子树的包含关系,分情况计算三个连通块的异或值。

4. 相关题目

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

AI模型偏见:检测与修正的实战框架

偏见——测试工程师面临的新缺陷类型随着AI系统在金融风控、智能招聘、医疗诊断等关键领域的深度渗透&#xff0c;其决策的公正性已成为产品可靠性的核心组成部分。对于软件测试从业者而言&#xff0c;AI模型偏见已不再是抽象的伦理议题&#xff0c;而是一种新型的、影响深远的…

作者头像 李华
网站建设 2026/4/16 23:07:25

测试自动化ROI:如何证明你的价值?

在软件测试领域&#xff0c;推行自动化测试已成为提升研发效能与保障质量的普遍选择。然而&#xff0c;一个始终萦绕在测试工程师、技术负责人乃至决策者心头的核心拷问是&#xff1a;我们投入了大量资源&#xff0c;究竟获得了什么回报&#xff1f; 尤其是在资源日益紧张、一切…

作者头像 李华
网站建设 2026/4/16 23:07:21

技术决策失误:5个常见认知偏差及应对

在软件测试领域&#xff0c;每一次测试用例的设计、每一个缺陷的评估、每一项风险评估的决策&#xff0c;都深刻影响着产品的质量与项目的成败。然而&#xff0c;即便是经验丰富的测试工程师&#xff0c;其专业判断也常常受到无形心理力量的干扰——认知偏差。这些思维捷径在人…

作者头像 李华
网站建设 2026/4/16 23:02:13

朱雀AI检测率高:手动改 vs 工具降,效果差多少?

朱雀AI检测率高&#xff1a;手动改 vs 工具降&#xff0c;效果差多少&#xff1f; “我自己改了两天两夜&#xff0c;朱雀AI率还是43%。” 一个学弟跟我说这话的时候&#xff0c;我能感受到那种无力感。他用DeepSeek写的论文&#xff0c;初检AI率71%&#xff0c;然后他花了整整…

作者头像 李华
网站建设 2026/4/16 23:01:20

面试官: MySQL LIKE索引失效原因解析(答案深度解析)持续更新

面试题&#xff1a;LIKE 为什么会失效&#xff1f;——索引失效的底层逻辑与实战避坑指南⚠️ 这是 MySQL 索引优化中高频踩坑点&#xff0c;90% 的候选人只答出“以 % 开头就失效”&#xff0c;但面试官真正想听的是&#xff1a;为什么失效&#xff1f;底层发生了什么&#xf…

作者头像 李华
网站建设 2026/4/16 23:01:15

Moonlight串流全屏终极指南:iPad无边框设置详解

1. 为什么你的Moonlight串流总有黑边&#xff1f; 每次用iPad串流PC游戏时&#xff0c;屏幕两边那两条黑边是不是让你特别烦躁&#xff1f;我刚开始用Moonlight的时候也遇到过同样的问题&#xff0c;折腾了好几天才找到完美解决方案。其实问题的核心很简单&#xff1a;分辨率不…

作者头像 李华