最长上升子序列(Longest Increasing Subsequence)

动态规划----最长子序列 引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1 例如有一个序列:1  7  3  5  9  4  8,它的最长上升子序列就是 1 3 4 8 长度为4. 分析: 这题目是经典的DP题目,也可叫作最长上升子序列或者 最长不下降子序列。有两种算法,复杂度分别为O(n*logn)和O 阅读详情

问题:

给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。输出这个最长的长度。(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题都看成同一个问题,其实仔细思考就会发现,这其实只是<符号定义上的问题,并不影响问题的实质)
例如有一个序列:1 7 3 5 9 4 8,它的最长上升子序列就是 1 3 4 8 长度为4.

分析:
对于几个给定的数字
a1、a2、... an,
必然存在最长上升子路径。有了路径,那么对于路径上的非起始节点ai而言,肯定会存在一个节点是排在ai前面的,不妨记为prev(ai),叫做前驱节点。
现在,可以给出问题中的最优子结构了:到达节点ai的最长递增路径,包含了到达这条路径上的每一个节点的最长递增路径。自然地,最长递增路径也就包含了到达前驱节点的最长递增路径。至于证明,可以用反证法简单地做到。
设L(ai)为到达节点ai的最长递增子序列的长度,并且它一般可以定义为
L(ai)=1+max{L(aj), aj<-prev(ai)}。
用文字描述就是:到达节点ai的最长递增子序列的长度,比所有可能的路径上的到达前驱节点aj的子序列的长度中的最大值还要多一。

例子:

原始数据为  5 2 8 6 3 6 9 7 

那么赋予它们的每一个数的初始长度均为0,所以辅助数组的元素全为0并且长度为8。接下来从5出发,对于所有比5大的数,即可以作为5的后续节点,修改为1。那么经过第一轮修改后,辅助数组变成
0 0 1 1 0 1 1 1。
而对于从2开始的情况,在修改时需要注意一点:当发现后续节点所对应的长度已经比先有长度加上一还要大时,就不应该修改了。因为根据最优解的值的递归定义,每一个节点对应的最长子序列的长度在构造时所选取的都是前驱节点中的长度的最大值。所以,第二轮变换后辅助数组变成了
0 0 1 1 1 1 1 1。
变化不大,只是第五个数字3对应的长度变成了1而已。这是对的,因为在3之前,能够作为前驱节点的也只有2而已,所以它们之间的距离是1,加上原来2对应的长度0,还是1。剩下的步骤和之前进行的这两步是一致的,于是到最后,辅助数组就会变成
0 0 1 1 1 2 3 3。
于是我们知道,在数字中拥有最大的长度的,也就是到达它们的递增子序列最长的数字是9和7。那么现在有了两个数组,一个是原来的输入,另一个则是计算出来的辅助数组,通过这两个数组,就可以得到在输入中所存在的至少一个最长递增子序列了。方法也很简单,首先需要找出在辅助数组中具有最大值的元素的下标是几。显然,下标是6和7(从0开始计算的下标),选择一个来演示就可以了,例如6。那么从下标为6的元素位置开始,可以知道它对应的子序列的长度为3,那么它的前驱对应的子序列的长度应该为2,于是将下标不停地减小,直到找到这样的一个数:这个数本身要比测试的数字小,并且它对应的长度恰好比测试的数字对应的长度小一。并且这样一直进行下去,直到找到了的数字对应的长度为0为止。此时把这个最后的数字加入已经得到的序列中,就可以得到在输入中存在的“最长递增子序列”了。

代码:

算法复杂度:O(n^2)

public class LIS {
    
    public static int getLIS(int arr[], int n) {
        int dp[] = new int[n];
        for (int i = 0; i < n; i++) {
            dp[i] = 0;
        }   
        int ans = 0;
        for (int i = 0; i < n-1; i++) {
            ans = dp[i];
            for (int j = i+1; j < n; j++) {
                if (arr[i] < arr[j] && dp[j] < ans+1) {
                    dp[j] = ans+1;
                }                    
            }
        }
        ans = 0;
        for (int i = 0; i < n; i++) {
            if(dp[i] > ans) {
                ans = dp[i];
            }
        }
        return ans;
    }
}
不过,这个方法只是得到最长子序列的长度,并没有实现得到最长子序列。




利用Virtuoso IC 618进行LDO稳定性分析与补偿设计 本文详细介绍了如何利用Virtuoso IC 618进行LDO稳定性分析与补偿设计。通过搭建仿真环境、运行STB分析诊断环路问题,并深入探讨密勒补偿、调零电阻等关键技术,帮助工程师在Virtuoso平台中高效完成LDO的稳定性优化与验证,确保芯片在各种工艺角下的鲁棒性。 阅读详情

相关推荐

西门子1200,与V90和步科MD60第三方伺服PN通讯

需要注意的是回零方式的选择,因为V90是绝对值编码器,这里回零模式选择模式7,系统自动根据编码器反馈以及组态的机械参数,计算出轴的位置,并且掉电保持。在线访问中,找到对应的网卡,以及下面扫描到的设备,可以在线修改ip地址和profinet名称,注意一定要和组态中的完全一致。以上硬件组态上完成,主要是gsd文件导入后,添加硬件,建立连接,修改ip和profinet名称,添加报文。1- 博图V18内,设备组态,网络视图中,拖入V90以及MD60伺服,并与PLC创建连接。向厂家索要GSD文件,PN的描述文件。

weixin_37596954的博客 2463

最长上升子序列LIS(Longest increasing subsequence)

介绍最长上升子序列问题,也就是Longest increasing subsequence缩写为LIS。是指在一个序列中求长度最长的一个上升子序列的问题。问题描述: 给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1 <s2 <s3 <… <sn并且这个子序列的长度最长。输出这个最长的长度(为了简化该类问题

橙子的博客 743

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面

本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。

efc123456的博客 1063

LeetCode——300. 最长上升子序列(动态规划)

题目描述: 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 例如: 定义:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度。 根据对 dp 数组的定义,现在想求 dp[5] 的值,也就是想求以 nums[5] 为结尾的最长递增子序列。nums[5] = 3,既然是递增子序列,我们只要找到前面那些结尾比 3 小的子序列,然后把 3 接到最后

FYPPPP的博客 361

电商平台大数据分析指标

一、五大关键数据分析指标 1.1活跃用户量 活跃用户量是一个基本的指标,有 DAU(日活跃用户)、WAU(周活跃用户)和 MAU(月活跃用户)三个层次; 1.2转化 转化是一个非常重要的指标,电商运营需要关注主路径、次路径甚至精细到每一个品类 / SKU 的转化率; 1.3留存 留存要从不同的时间周期上研究,包括次日留存率、3 日、7 日、30 日留存; 1.4复购 复购则要从 3 个角度去看,复购用户量、复购率和复购金额比; 1.5GMV GMV 是最重要的指标,我们的运营最终是围绕这

默主归沙的博客 4818

从零到一:基于DESeq2的转录组差异表达分析实战指南

本文详细介绍了基于DESeq2的转录组差异表达分析实战指南,涵盖数据准备、标准化处理、差异分析及结果解读等关键步骤。DESeq2凭借其稳定性和对低表达基因的友好处理,成为转录组数据分析的首选工具。文章还提供了常见问题排查和优化建议,帮助研究者高效完成从分析到发表的完整流程。

weixin_26759093的博客 272

最长上升子序列LIS

问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7....an,求它的一个子序列(设为s1,s2,...sn),使得这个子序列满足这样的性质,s1 例如有一个序列:1  7  3  5  9  4  8,它的最长上升子序列就是 1 3 4 8 长度为4. 算法1:动态规划:时间复杂度:(n^2):我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直

liwei的专栏 715

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 97

最长递增子序列

题目描述 给出一个序列a1,a2,a3,a4,a5,a6,a7…an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质:s1<s2<s3<…<sn并且这个子序列的长度最长。输出这个最长子序列的长度,要求时间复杂度为O(n2)。 输入 每组输入包括两行,第一行为序列长度n,第二行为序列。 输出 输出最长递增子序列的长度。 样例输入 7 1 7 3 5 ...

小叮当不懒的博客 569

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 436

基于VSCode+clangd插件打造高效C++开发环境之四:clangd配置

本文介绍如何配置VSCode+clangd插件进行高效C++开发。重点内容包括:1)生成compile_commands.json文件,通过ninja工具提取编译命令并使用gen_compdb脚本转换;2)配置clangd命令行参数,如设置后台索引、并行度等;3)编写.clangd配置文件,调整编译标志和诊断选项;4)添加.clang-format文件定义代码风格;5)在VSCode中添加远程服务器工作目录。配置完成后需重启clangd服务使更改生效。文章还提供了MTK/QCOM等不同平台生成compile

5070

最长上升子序列Longest Increasing Subsequence

给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。 方法1:时间复杂度n2,容易想到,记录数组中每个元素作为上升子序列最后一个元素的最大长度。 import java.math.*; class Solution { public in...

weixin_30267785的博客 158

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最长上升子序列 LIS(Longest Increasing Subsequence)

引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1 例如有一个序列:1 7 3 5 9 4 8,它的最长上升子序列就是 1 3 4 8 长度为4. 分析: 这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长

uyehniy的专栏 376

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

300. 最长上升子序列(Longest Increasing Subsequence)

300. 最长上升子序列(Longest Increasing Subsequence)题解动态规划复杂度分析PythonJava(待完成)动态规划+二分查找复杂度分析PythonJava(待完成) 题解 动态规划 dp[i]dp[i]dp[i]表示到当前位置的最长上升子序列的长度。 特判,若数组为空,返回0 初试化dp=[1,1,⋯ ,1]dp=[1,1,\cdots,1]dp=[1,1...

朱师傅的博客 221

96 最长上升子序列LIS(Longest Increasing Subsequence)

lintcode题号——76,难度——medium

SeeDoubleU的专栏 558

Longest Increasing Subsequence 最长上升子序列

给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。 进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? 思路:...

qq_26410101的博客 430

最长上升子序列(Longest Increasing Subsequence,LIS)

最长上升子序列 介绍最简单的方法,方法复杂度为n*n,流程是先遍历整个数组,然后从当前的下标的数字看看之前的哪个比现在的还要小,然后在上次的最大的状态的最长数加一。代码如下: #include <bits/stdc++.h> using namespace std; int LIS(int *array, int len) { int dp[len]; for (int i=0; i<len; i++) { dp[i] = 1; // 更新当前的状态

qq_43524270的博客 167

最长上升子序列LIS(Longest Increasing Subsequence)

算法1:时间复杂度:O(n^2):我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。 #inc...

diaocu20031216的博客 171

LeetCode 300. Longest Increasing Subsequence 最长上升子序列

LeetCode 300. Longest Increasing Subsequence 最长上升子序列300. Longest Increasing Subsequence题目描述示例:解答代码解法1解法2 300. Longest Increasing Subsequence 题目描述 Given an unsorted array of integers, find the length o...

importsys的博客 491

最长上升子序列 ( Longest Increasing Subsequence)

Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increas...

DouMiaoO_Oo的博客 305

最长上升子序列(Longest increasing subsequence)

  问题描述         对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足{s1&lt;s2&lt;s3&lt;…&lt;sm}。求A的最长子序列的长度。 动态规划法 算法描述:         设数串的长度为n,L[i]为以第i个数为末尾的最长上升子序列的长度,a[i]为数串的第i个数。         L[i]的计算方法为:从前i-1个数中找出满足a...

无限迭代中...... 797

leetcode-300. Longest Increasing Subsequence 最长上升子序列

Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is...

别说话写代码的博客 392

leetcode-300-最长上升子序列(longest increasing subsequence)-java

题目及测试 package pid300; /*Longest Increasing Subsequence 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可...

今天吃了吗的博客 1413
下一篇: Dijkstra最短路径算法
javaMyths
博客等级 码龄15年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值