蓝桥试题:蓝桥勇士(LIS)
一、题目描述
小明是蓝桥王国的勇士,他晋升为蓝桥骑士,于是他决定不断突破自我。
这天蓝桥首席骑士长给他安排了 N 个对手,他们的战力值分别为 a1,a2,...,an,且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战,也可以选择避战。
作为热血豪放的勇士,小明从不走回头路,且只愿意挑战战力值越来越高的对手。
请你算算小明最多会挑战多少名对手。
输入描述
输入第一行包含一个整数 N,表示对手的个数。
第二行包含 N 个整数 a1,a2,...,an,分别表示对手的战力值。
1≤N≤1e3,1≤ai≤1e9。
输出描述
输出一行整数表示答案。
输入输出样例
输入
6
1 4 3 2 5 6
输出
4
二、 LIS算法介绍
最长递增子序列(LIS)算法详解及Java实现
最长递增子序列(Longest Increasing Subsequence,LIS)问题要求在一个无序的序列中找到最长的子序列,使得该子序列中的元素严格递增。以下是两种常见解法及其Java实现。方法一:动态规划(时间复杂度 O(n²))
算法思路定义 dp[i] 表示以第 i 个元素结尾的最长递增子序列长度。初始化每个 dp[i] 为 1(每个元素本身构成一个长度为 1 的子序列)。
对于每个元素 nums[i],遍历其之前的所有元素 nums[j](j < i),若 nums[j] < nums[i],则更新 dp[i] = max(dp[i], dp[j] + 1)。
最终结果为 dp 数组中的最大值。
import java.util.Arrays;public class LIS {public int lengthOfLIS(int[] nums) {if (nums == null || nums.length == 0) return 0;int[] dp = new int[nums.length];Arrays.fill(dp, 1);int maxLen = 1;for (int i = 1; i < nums.length; i++) {for (int j = 0; j < i; j++) {if (nums[j] < nums[i]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}maxLen = Math.max(maxLen, dp[i]);}return maxLen;} }
方法二:贪心 + 二分查找(时间复杂度 O(n log n))
算法思路维护一个数组 tail,其中 tail[i] 表示长度为 i+1 的最长递增子序列的最小末尾元素。
遍历原数组,对于每个元素 num:
若 num 大于 tail 的最后一个元素,直接添加到 tail。
否则,使用二分查找在 tail 中找到第一个大于等于 num 的位置,替换为该元素。
最终 tail 的长度即为最长递增子序列的长度。
import java.util.ArrayList; import java.util.Collections;public class LIS {public int lengthOfLIS(int[] nums) {ArrayList<Integer> tail = new ArrayList<>();for (int num : nums) {if (tail.isEmpty() || num > tail.get(tail.size() - 1)) {tail.add(num);} else {int index = Collections.binarySearch(tail, num);index = (index < 0) ? -index - 1 : index;tail.set(index, num);}}return tail.size();} }
三、代码演示
import java.util.Scanner;public class Main { public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 读取输入的数组长度 nint[] a = new int[n]; // 创建数组 a 存储输入序列for (int i = 0; i < n; i++) {a[i] = scanner.nextInt(); // 逐个读取元素到数组 a}int[] dp = new int[n]; // 定义动态规划数组 dp,长度与输入数组一致int max = 1; // 初始化最长子序列长度为1(至少包含一个元素)for (int i = 0; i < n; i++) { // 外层循环遍历每个元素dp[i] = 1; // 关键修正:初始化 dp[i] 为1(每个元素自身构成长度为1的子序列)for (int j = 0; j < i; j++) { // 内层循环遍历 i 之前的所有元素 jif (a[i] > a[j]) { // 若当前元素 a[i] > a[j],满足递增条件dp[i] = Math.max(dp[i], dp[j] + 1); // 更新 dp[i] 为更大的值(继承 j 的状态+1)}}max = Math.max(max, dp[i]); // 更新全局最大值}System.out.println(max); // 输出最长递增子序列的长度}
}
示例验证
8
10 9 2 5 3 7 101 18
执行过程
初始化
dp 数组初始化为全1:[1, 1, 1, 1, 1, 1, 1, 1]。外层循环 i=0(元素10)
内层循环无 j < 0,直接跳过。
max 保持为1。
外层循环 i=1(元素9)
检查 j=0:9 < 10,不更新 dp[1]。
dp 保持为 [1, 1, ...],max 仍为1。
外层循环 i=2(元素2)
检查 j=0:2 < 10 → 不更新。
检查 j=1:2 < 9 → 不更新。
dp 保持为 [1, 1, 1, ...],max 仍为1。
外层循环 i=3(元素5)
检查 j=0:5 < 10 → 不更新。
检查 j=1:5 < 9 → 不更新。
检查 j=2:5 > 2 → dp[3] = max(1, 1+1) = 2。
dp 变为 [1, 1, 1, 2, ...],max 更新为2。
外层循环 i=4(元素3)
检查 j=2:3 > 2 → dp[4] = max(1, 1+1) = 2。
dp 变为 [1, 1, 1, 2, 2, ...],max 仍为2。
外层循环 i=5(元素7)
检查 j=2:7 > 2 → dp[5] = 1+1 = 2。
检查 j=3:7 > 5 → dp[5] = max(2, 2+1) = 3。
检查 j=4:7 > 3 → dp[5] = max(3, 2+1) = 3。
dp 变为 [1, 1, 1, 2, 2, 3, ...],max 更新为3。
外层循环 i=6(元素101)
遍历所有 j < 6,找到最长子序列 [2,5,7],长度3 → dp[6] = 3+1 = 4。
max 更新为4。
外层循环 i=7(元素18)
找到最长子序列 [2,5,7,18],但 dp[7] = 4(与 dp[6] 相同)。
max 保持为4。
相关文章:
蓝桥试题:蓝桥勇士(LIS)
一、题目描述 小明是蓝桥王国的勇士,他晋升为蓝桥骑士,于是他决定不断突破自我。 这天蓝桥首席骑士长给他安排了 N 个对手,他们的战力值分别为 a1,a2,...,an,且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战…...
Trae IDE新建C#工程
目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说,Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…...
Linux基础--进程管理
目录 静态查看进程 使用命令: ps 动态查看进程 使用命令: top 关闭进程: 使用命令: kill 查看进程占用端口 使用命令: ss 编辑 查看某端口是否被进程占用 使用命令: lsof 作业管理 进程后台运行: 使用命令: jobs 将后台进程调回前台 使用指令: fg 将前台进…...
Java面向对象(详细解释)
第一章 Static关键字 1.static的介绍以及基本使用 1.概述:static是一个静态关键字 2.使用: a.修饰一个成员变量: static 数据类型 变量名 b.修饰一个方法: 修饰符 static 返回值类型 方法名(形参){…...
qt ui相关的第三方库插件库
Qt UI相关的第三方库和插件库有很多,能帮助开发者提高开发效率,扩展UI功能,增强可用性和美观度。以下是一些常见的第三方库和插件: 1. QCustomPlot 功能:用于在Qt应用程序中创建交互式的二维绘图。特点:支…...
详解动态规划算法
动态规划 一、动态规划的核心思想二、动态规划的步骤1. 定义状态(State)2. 确定状态转移方程(State Transition Equation)3. 确定边界条件(Base Case)4. 填表(Table Filling)或递归计…...
LINUX网络基础 [五] - HTTP协议
目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…...
慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8
慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8 现在是已经到了课程的第十章了,开始进行配置项目环境了。现在要完成的任务是项目可以正常运行,而且可以自由切换配置,开发/测试。 下面是当前的目录结构图: 现在来解释一…...
华为配置篇-OSPF基础实验
OSPF 一、简述二、常用命令总结三、实验3.1 OSPF单区域3.2 OSPF多区域3.3 OSPF 的邻接关系和 LSA 置底 一、简述 OSPF(开放式最短路径优先协议) 基本定义 全称:Open Shortest Path First 类型:链路状态路由协议(IGP&…...
闭包:JavaScript 中的隐形大杀器
你可能已经在很多地方听说过闭包这个词,尤其是涉及到 JavaScript 的作用域和异步操作时。闭包是 JavaScript 中非常核心的概念,然而它又非常容易让开发者感到困惑。今天我们就来深入剖析闭包,帮助你真正理解它的工作原理,以及如何…...
【消息队列】数据库的数据管理
1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说,具体要使用哪个数据库,是需要稍作考虑的,如果直接使用 MySQL 数据库也是能实现正常的功能,但是 MySQL 也是一个客户端服务器程序,也就意味着如果想在其他服…...
玩转ChatGPT:GPT 深入研究功能
一、写在前面 民间总结: 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么,ChatGPT呢? 看Deep Research(深入研究)功能。 对于科研狗来说,在这个文章爆炸的时代,如何利用AI准确、高效地收…...
Centos8部署mongodb报错记录
使用mongo ops安装mongodb6.0.4副本集报错 error while loading shared libraries: libnetsnmpmibs.so.35: cannot open shared object file: No such file or directory 解决 yum install net-snmp net-snmp-devel -y建议:初始化系统时把官网上的依赖包都装一遍 即…...
2024四川大学计算机考研复试上机真题
2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测:https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …...
前端面试题 口语化复述解答(从2025.3.8 开始频繁更新中)
背景 看了很多面试题及其答案。但是过于标准化,一般不能直接用于回复面试官,这里我将总结一系列面试题,用于自我复习也乐于分享给大家,欢迎大家提供建议,我必不断完善之。 Javascript ES6 1. var let const 的区别…...
更多文章请查看
更多文章知识请移步至下面链接,期待你的关注 如需查看新文章,请前往: 博主知识库https://www.yuque.com/xinzaigeek...
vulnhub靶场之【digitalworld.local系列】的vengeance靶机
前言 靶机:digitalworld.local-vengeance,IP地址为192.168.10.10 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式ÿ…...
MySql的安装及数据库的基本操作命令
1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…...
中性点直接接地电网接地故障Simulink仿真
1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系代为转换) 2.系统仿真图: 3.中性点直接接地电网接地故障基本概念(本仿…...
Linux16-数据库、HTML
数据库: 数据存储: 变量、数组、链表-------------》内存 :程序运行结束、掉电数据丢失 文件 : 外存:程序运行结束、掉电数据不丢失 数据库: …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
