AVRIL_START_JANCOKALIVEAVRIL_END_JANCOK Interactive Terminal

Command Executor

点亮战争迷雾 - 魔改工程师

点亮战争迷雾

2026 华为OD机试真题8月19日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

有一张二叉树地图,每一个节点都被战争迷雾所覆盖。在二叉树节点上插上一个侦察守卫,可以照亮该节点自身以及它的父节点和它的子节点的战争迷雾。在每个节点上插上侦察守卫的成本并不一样,用 cost[i] 表示节点 i 上的成本,每个节点的成本是正整数。

要求:

  1. 所有的战争迷雾都被驱散。
  2. 所花费的总成本最小。

补充说明:

  1. 单个节点的成本,1 <= cost[i] <= 100
  2. 节点总数量 <= 1000

2026 华为OD机试真题8月19日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

输入描述

一行,一个层序遍历字符串(含首尾圆括号),空节点用 # 表示,例如 (5,1,10,2,8,#,3)

输出描述

输出最小的总费用。

示例1

输入

(5,1,10,2,8,#,3)

输出

4

说明

image-20260819230232379

最优方案:

  • 在节点 2(成本 1)和节点 6(成本 3)插上侦察守卫,总成本 4
  • 节点 2 覆盖 2,1,4,5;节点 6 覆盖 6,3;所有节点均被覆盖

示例2

输入

(3,1,1)

输出

2

说明

image-20260819230221618

  • 方案一:在节点 1 插上侦察守卫,可照亮所有地图,成本是 3
  • 方案二:在节点 2 和节点 3 插上侦察守卫,可照亮所有地图,成本是 1+1=2
  • 因此,最低成本的方案是方案二,返回值是 2

解题思路

核心思想

这是二叉树上的最小代价覆盖问题。一个守卫可以覆盖自己、父节点和左右子节点。

对每个节点做树形 DP,维护三种状态:

  • wait:当前节点没有放守卫,当前节点暂时未被子节点覆盖,等待父节点覆盖。
  • covered:当前节点没有放守卫,但已经被某个子节点的守卫覆盖。
  • placed:当前节点放置守卫。

根节点没有父节点,因此最终答案不能取 wait,只能取 min(covered, placed)

算法步骤

  1. 按层序字符串恢复二叉树,# 表示空节点。
  2. 后序遍历每个节点,先计算左右子树的三种状态。
  3. 当前节点放守卫时,左右子树可以取各自最小合法状态。
  4. 当前节点不放守卫但已覆盖时,至少一个孩子必须放守卫。
  5. 当前节点等待父节点覆盖时,左右孩子自身都必须已经被覆盖。
  6. 根节点不能等待父节点,返回 min(covered, placed)

复杂度分析

设二叉树节点数为 n

  • 时间复杂度:O(n)
  • 空间复杂度:O(n),主要来自递归栈和
THE END