dp 最长上升子序列 拦导弹
发布日期:2021-05-10 04:59:07 浏览次数:23 分类:精选文章

本文共 1020 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要计算最少需要配备多少套导弹拦截系统。每套系统发射的炮弹高度必须是递减的。因此,我们可以将其转化为寻找最长递减子序列的问题,以确定最少需要的系统数。

方法思路

为了找到最少需要的导弹拦截系统数量,我们可以将其转化为寻找最长递增子序列的问题。每个递增子序列对应一个系统,这样系统数越少,越能覆盖更多的导弹。

具体步骤如下:

  • 初始化一个数组 tails,用于记录递增子序列的最小末尾值。
  • 遍历导弹高度数组,对于每个元素,使用二分查找找到其在 tails 中的位置,更新 tails 数组。
  • 最终,tails 数组的长度即为所需的系统数。
  • 解决代码

    import bisect
    def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    while ptr < len(input):
    n = int(input[ptr])
    ptr += 1
    a = list(map(int, input[ptr:ptr + n]))
    ptr += n
    tails = []
    for x in a:
    idx = bisect.bisect_right(tails, x)
    if idx == 0:
    tails.insert(0, x)
    else:
    tails[idx] = x
    print(len(tails))
    if __name__ == "__main__":
    main()

    代码解释

  • 读取输入:使用 sys.stdin.read 读取所有输入数据,并将其拆分为列表处理。
  • 初始化变量:读取导弹数量 n 和高度数组 a
  • 处理每个元素:对于每个导弹高度 x,使用 bisect.bisect_righttails 数组中找到插入位置。如果位置为 0,直接插入到开头;否则,替换插入位置处的值。
  • 输出结果:最终,tails 数组的长度即为最少需要的导弹拦截系统数量。
  • 这种方法利用了二分查找优化,最长递增子序列的时间复杂度为 O(n log n),适用于较大的数据规模。

    上一篇:dp m段连续区间和
    下一篇:打表的一些操作

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月16日 09时06分49秒