You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用最少元素覆盖1~n元素并保证连通性?算法求解咨询

算法设计方案:带连通相邻覆盖约束的最少选点问题

问题核心转化

你的问题可以等价转化为:
给定n个区间,每个元素s对应区间[A_s, B_s](其中A_s = s - x[s],B_s = s + y[s]),需要选择最少数量的区间,使得每个整数k∈{1,2,...,n-1}都被至少一个选中区间包含(即选中区间满足A_s ≤k且B_s ≥k+1)。

这个转化的依据是:相邻元素i和i+1被同一个选中元素覆盖,等价于该元素的区间同时包含i和i+1,对应k=i时满足上述条件。而只要所有相邻对都被覆盖,所有元素自然被覆盖(每个元素属于至少一个相邻对)。

贪心算法(最优解)

这是解决该问题最高效的方法,时间复杂度为O(n)或O(n log n)(取决于预处理排序),步骤如下:

  1. 预处理区间:为每个元素s计算对应的A_s和B_s,同时记录每个区间能覆盖的最远相邻对k_end = B_s - 1(即该区间能覆盖到k=k_end,对应元素k_end和k_end+1)。
  2. 初始化变量:
    • count = 0(选中元素数量)
    • current_k = 1(当前需要覆盖的第一个未覆盖相邻对)
    • max_reach = 0(当前已覆盖的最远相邻对)
  3. 循环覆盖所有相邻对:
    • 当max_reach < n-1时:
      a. 在所有满足A_s ≤ current_k的区间中,找到k_end最大的那个元素s。
      b. 若不存在这样的元素,说明问题无解(题目应保证有解)。
      c. 选中s,count += 1。
      d. 更新max_reach为该s的k_end。
      e. 更新current_k为max_reach + 1。

示例验证(你的n=7案例)

元素对应的区间及覆盖范围:

  • s=1: [1,2] → 覆盖k=1
  • s=2: [1,4] → 覆盖k=1,2,3
  • s=3: [2,4] → 覆盖k=2,3
  • s=4: [2,6] → 覆盖k=2,3,4,5
  • s=5: [4,6] → 覆盖k=4,5
  • s=6: [5,7] → 覆盖k=5,6
  • s=7: [6,7] → 覆盖k=6

执行步骤:

  1. current_k=1,找到A_s≤1且k_end最大的s=2,count=1,max_reach=3,current_k=4。
  2. current_k=4,找到A_s≤4且k_end最大的s=4,count=2,max_reach=5,current_k=6。
  3. current_k=6,找到A_s≤6且k_end最大的s=7,count=3,max_reach=6(等于n-1=6),循环结束。
    最终选中s=2、4、7,与最优解一致。

动态规划方案(适用于复杂扩展场景)

如果后续需要添加其他约束,可使用动态规划,步骤如下:

  1. 状态定义:dp[k]表示覆盖前k个相邻对(k=0到n-1)所需的最少选中元素数量,dp[0] = 0,其余初始化为无穷大。
  2. 状态转移:
    • 对每个元素s,计算其覆盖的相邻对范围[k_start, k_end] = [A_s, B_s - 1]。
    • 更新dp[k_end] = min(dp[k_end], dp[k_start - 1] + 1)。
    • 为优化效率,可维护前缀最小值数组min_dp[k] = min(dp[0..k]),这样转移时可直接用min_dp[k_start - 1] + 1更新dp[k_end]。
  3. 结果:dp[n-1]即为最少选中元素数量。

关键注意事项

  • 之前尝试的方法失效,核心原因是未抓住相邻元素必须共享覆盖源的约束,将问题转化为覆盖相邻对而非单个元素是解决关键。
  • 贪心算法的正确性基于:每次选择能覆盖当前未覆盖起点且覆盖最远的区间,能最小化后续选点数量,这是经典区间覆盖贪心的变种。

学习资源方向

  • 深入掌握经典区间覆盖问题的贪心解法,理解其正确性证明。
  • 学习动态规划状态设计,重点关注带范围约束的优化问题。
  • 了解集合覆盖问题的变种,尤其是具有贪心最优解的特殊场景。

内容的提问来源于stack exchange,提问作者Rizzu Rizzman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:44:59