187. 导弹防御系统

Powered by:NEFU AB-IN

Link

文章目录

  • 187. 导弹防御系统
    • 题意
    • 思路
    • 代码

187. 导弹防御系统

  • 题意

为了对抗附近恶意国家的威胁,R国更新了他们的导弹防御系统。

一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。

例如,一套系统先后拦截了高度为 3和高度为 4的两发导弹,那么接下来该系统就只能拦截高度大于 4的导弹。

给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。

  • 思路

目标是将一个给定的序列分成尽可能少的上升子序列和下降子序列,只能爆搜

用dfs求最小值的方法

  • 迭代加深
  • 设最小值,每次更新(本次采取)

这个问题可以通过递归深度优先搜索(DFS)和剪枝技术来解决。具体思路如下:

  1. 定义子序列末尾元素:
  • 用两个数组 up 和 down 分别存储当前所有上升子序列和下降子序列的末尾元素。
  • up[i] 表示第 i 个上升子序列的末尾元素。
  • down[i] 表示第 i 个下降子序列的末尾元素。
  1. 递归函数设计:

设计一个递归函数 dfs(u, su, sd),也就是选择这个数 h[u],它要么在递增序列中,要么在下降序列中。其中:

  • u 表示当前处理的序列位置。
  • su 表示当前已建立的上升子序列数量。
  • sd 表示当前已建立的下降子序列数量。
  • 在递归过程中,不断尝试将当前元素放入已有的上升子序列或下降子序列中,或者创建新的子序列。
  1. 剪枝优化:
  • 使用全局变量 min_depth 来记录当前找到的最小子序列数量。
  • 如果在递归过程中,当前子序列数量 su + sd 已经大于或等于 min_depth,则停止搜索(剪枝),因为没有必要继续探索这种情况。
  1. 递归结束条件:

如果已经处理完所有元素,即 u == n,更新 min_depth 为当前的子序列数量 su + sd。

  1. 递归搜索过程:
  • 尝试将当前元素 h[u] 放入已有的上升子序列中。这里采用贪心思想,去替换在最比 h[u] 小的数,保证兼容性最大(类似最长上升子序列的贪心解法)

  • 如果没有合适的上升子序列,则创建一个新的上升子序列。

  • 类似地,尝试将当前元素 h[u] 放入已有的下降子序列中。

  • 如果没有合适的下降子序列,则创建一个新的下降子序列。

  • 代码

# import
from re import T
from sys import setrecursionlimit, stdin, stdout, exit
from collections import Counter, deque, defaultdict
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from bisect import bisect_left, bisect_right
from datetime import datetime, timedelta
from string import ascii_lowercase, ascii_uppercase
from math import log, gcd, sqrt, fabs, ceil, floor
from typing import TypeVar, List, Dict, Any, Union, GenericTYPE = TypeVar('TYPE')# Data structure
class SA(Generic[TYPE]):def __init__(self, x: TYPE, y: TYPE):self.x = xself.y = ydef __lt__(self, other: 'SA[TYPE]') -> bool:return self.x < other.xdef __eq__(self, other: 'SA[TYPE]') -> bool:return self.x == other.x and self.y == other.ydef __repr__(self) -> str:return f'SA(x={self.x}, y={self.y})'# Constants
N = int(2e5 + 10)  # If using AR, modify accordingly
M = int(20)  # If using AR, modify accordingly
INF = int(2e9)
OFFSET = int(100)# Set recursion limit
setrecursionlimit(INF)# Read
input = lambda: stdin.readline().rstrip("\r\n")  # Remove when Mutiple data
read = lambda: map(int, input().split())
read_list = lambda: list(map(int, input().split()))# Func
class std:letter_to_num = staticmethod(lambda x: ord(x.upper()) - 65)  # A -> 0num_to_letter = staticmethod(lambda x: ascii_uppercase[x])  # 0 -> Aarray = staticmethod(lambda x=0, size=N: [x] * size)array2d = staticmethod(lambda x=0, rows=N, cols=M: [std.array(x, cols) for _ in range(rows)])max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)filter = staticmethod(lambda func, iterable: list(filter(func, iterable)))@staticmethoddef find(container: Union[List[TYPE], str], value: TYPE) -> int:"""Returns the index of value in container or -1 if value is not found."""if isinstance(container, list):try:return container.index(value)except ValueError:return -1elif isinstance(container, str):return container.find(value)# —————————————————————Division line ——————————————————————def min_defense_systems(n, heights):global resres = nup = std.array(0, n)down = std.array(0, n)def dfs(u, su, sd):global res# 剪枝if su + sd >= res:return if u == n:res = min(res, su + sd)return for i in range(su):if up[i] < heights[u]:tmp = up[i]up[i] = heights[u]dfs(u + 1, su, sd)up[i] = tmpbreakelse:up[su] = heights[u]dfs(u + 1, su + 1, sd)for i in range(sd):if down[i] > heights[u]:tmp = down[i]down[i] = heights[u]dfs(u + 1, su, sd)down[i] = tmpbreakelse:down[sd] = heights[u]dfs(u + 1, su, sd + 1)dfs(0, 0, 0)return res while True:n, = read()if n == 0:breakheights = read_list()print(min_defense_systems(n, heights))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十天 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序复习

1143.最长公共子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/ 文档讲解&#xff1a;https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1… 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ye4y1L7CQ 最近…

swagger访问路径

Swagger 2.x 版本 访问地址&#xff1a;http://{ip}:{port}/{context-path}/swagger-ui.html {ip} 是你的服务器IP地址。 {port} 是你的应用服务端口&#xff0c;通常为8080。 {context-path} 是你的应用上下文路径&#xff0c;如果应用部署在根路径下&#xff0c;则为空。 …

搭建 MySQL MHA

搭建 MySQL MHA 搭建 MySQL MHA实验拓扑图实验环境实验思路MHA架构故障模拟 实验部署数据库安装主从复制部署时间同步主服务器配置从服务器配置创建链接 MHA搭建安装依赖的环境安装 node 组件安装 manager 组件配置无密码认证在 manager 节点上配置 MHA管理 mysql 节点服务器创…

Spring Cloud Alibaba之网关组件Gateway

实例演示1&#xff1a;在微服务体系中引入GateWay组件 创建一个ServiceForGateway的SpringBoot项目&#xff0c;通过在控制类编写方法对外提供服务 RestController public class Controller {RequestMapping("/getAccount/{id}")public String getAccount(PathVaria…

面试突击:Java 集合知识体系梳理

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。在 Java 开发中&#xff0c;集合类对象绝对是被使用最频繁的对象之一。因此&#xff0c;深入了解集合类对象的底层数…

热敏晶振:成本效益的选择与温补晶振的比较

在精密电子系统的设计中&#xff0c;晶振作为时间基准源&#xff0c;其频率稳定性直接影响到整个系统的性能。其中&#xff0c;温补晶振(Temperature Compensated Crystal Oscillator&#xff0c;简称TCXO)与热敏晶振(Thermistor Compensated Crystal Oscillator)作为在特殊温度…

面试-java异常体系

1.java异常体系 error类是指与jvm相关的问题。如系统崩溃&#xff0c;虚拟机错误&#xff0c;内存空间不足。 非runtime异常不处理&#xff0c;程序就没有办法执行。 一旦遇到异常抛出&#xff0c;后面的异常就不会进行。 (1)常见的error以及exception 2.java异常要点分析…

kubekey 安装高可用 kubernetes 集群

1. 准备环境 1.1 机器准备 4 台机器&#xff0c;操作系统&#xff1a;Ubuntu 24.04/RHEL8/CentOS9 10.111.3.53 master1 10.111.3.54 master2 10.111.3.55 master3 10.111.3.57 node41.2 安装依赖和配置 所有节点都需要执行&#xff1a; Ubuntu: apt-get install -y soca…

[Docker] Ubuntu安装Home Assistant

本文主要记载一些Ubuntu安装Home Assistant的细节,方便后面重装。 1. 安装Docker 安装依赖 $ sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common添加 Docker 官方 GPG 密钥 $ curl -fsSL https://mirrors.ustc…

【AI大模型】Transformers大模型库(十四):Datasets Viewer

目录 一、引言 二、Datasets Viewer数据查看器 2.1 概述 2.2 示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服务。 &#x1f917; Transformers 提供了数以千计的预训练…

如何使用大模型进行文本分类任务?

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&…

光遮断器的检测

引脚判别 在检测光遮断器时&#xff0c;先检测出发光二极管的引脚。万用表选择R1k挡&#xff0c;测量光电耦合器任意两个引脚之间的电阻&#xff0c;当出现阻值小时&#xff0c;黑表笔接的为发光二极管的正极&#xff0c;红表笔接的为负极&#xff0c;剩余两极为光敏管的引脚。…

openlayer 鼠标点击船舶,打开船舶简单弹框

背景&#xff1a; 对创建的地图对象&#xff0c;可以添加上监听事件&#xff0c;常用的有&#xff1a;地图点击事件、鼠标移动事件。 通过监听这些事件&#xff0c;又可以区分不同图层的不同要素&#xff0c;获取不同数据&#xff1b; 根据这些数据&#xff0c;又可以发起网络请…

【介绍下SCSS的基本使用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

微服务应用与开发知识点练习【Nacos、Ribbon、Sentinel】

1.微服务架构的主要优势是什么&#xff1f;&#xff08; &#xff09; A.简化开发过程 B.提高单体应用的性能 C.允许各个服务独立开发、部署和扩展 D.减少代码量 2. 在Spring Boot项目中&#xff0c;配置文件的默认名称是什么&#xff1f;&#xff08; &#xff09; A. co…

React的Props、生命周期

Props 的只读性 “Props” 是 React 中用于传递数据给组件的一种机制&#xff0c;通常作为组件的参数进行传递。在 React 中&#xff0c;props 是只读的&#xff0c;意味着一旦将数据传递给组件的 props&#xff0c;组件就不能直接修改这些 props 的值。所以组件无论是使用函数…

Linux编程---给函数取别名

0 Preface/Foreword 1 代码 1.1 源代码 #include <stdio.h> #include <string.h> int sum(int a, int b);int sum_alias(int a, int b) __attribute__ ((alias("sum"))); int main() { int ret 0; ret sum(5, 5) sum_alias(5, 5); …

线性相关,无关?秩?唯一解(只有零解),无穷解(有非零解)?D=0,D≠0?

目录 线性有关无关 和 唯一解&#xff08;只有零解&#xff09;&#xff0c;无穷解&#xff08;有非零解&#xff09;之间的关系 D0&#xff0c;D≠0&#xff1f; 和 秩 的关系 串起来&#xff1a; 线性相关&#xff0c;无关&#xff1f;秩&#xff1f;唯一解&#xff08;只…

华为认证hcna题库背诵技巧有哪些?hcna和hcia有什么区别?

大家都知道华为认证hcna是有题库供考生刷题备考的&#xff0c;但题库中海量的题目想要在短时间背诵下来可并不是一件容易的事情&#xff0c;这就需要我们掌握一定的技巧才行。华为认证hcna题库背诵技巧有哪些? hcna和hcna这二者又有什么区别呢?今天的文章将为大家进行详细解…

Tomcat高效部署与性能优化

Tomcat高效部署与性能优化 一、引言 Apache Tomcat是一个广泛使用的开源Java Web应用服务器&#xff0c;它轻量级、易扩展&#xff0c;并支持Servlet和JSP规范。然而&#xff0c;随着业务的发展和用户数量的增长&#xff0c;Tomcat的性能和稳定性变得至关重要。本文将介绍如何…