最长递增子序列-Longest Increasing Subsequence

最长递增子序列详解(longest increasing subsequence) 一个各公司都喜欢拿来做面试笔试题的经典动态规划问题,互联网上也有很多文章对该问题进行讨论,但是我觉得对该问题的最关键的地方,这些讨论似乎都解释的不很清楚,让人心中不快,所以自己想彻底的搞一搞这个问题,希望能够将这个问题的细节之处都能够说清楚。 对于动态规划问题,往往存在递推解决 阅读详情

动态规划的经典题!


package DP;

import java.util.Arrays;	

public class LIS {

	public static void main(String[] args) {
		int[] A = {5,3,4,8,6,7};
		System.out.println(lis(A));
		System.out.println(lis2(A));
		System.out.println(lis3(A));
	}

	// Naive O(n2) DP solution
	// 看A[i]能接在哪些数字后面
	public static int lis(int[] A){
		
		int[] dp = new int[A.length];		// 对每一个元素存储它的lis
		Arrays.fill(dp, 1);			// 初始化,每个数字本身就是长度为1的lis
		
		// 对每一个数字求其LIS
		for(int i=1; i<A.length; i++){
			// 找出A[i]能接在哪些数字后面,
			// 如果可以接,找出接完后长度最大那个
			for(int j=i-1; j>=0; j--){
				// 只有符合递增规律的才能接
				if(A[j]<A[i]){
					// 找出接完后长度最大那个
					if(dp[j] +1 > dp[i]){
						dp[i] = dp[j] + 1;
					}
				}
			}
		}
		
		int max = Integer.MIN_VALUE;
		// 现在已经有每个数的LIS,找出最长的那个
		for(int i=0; i<dp.length; i++){
			if(dp[i] > max){
				max = dp[i];
			}
		}
		
		return max;
	}
	
	// Use 2 max
	public static int lis2(int[] A){
		int[] dp = new int[A.length];
		Arrays.fill(dp, 1);
		
		int max = 0;
		for(int i=1; i<A.length; i++){
			for(int j=0; j<i; j++){
				if(A[j] < A[i]){
					// 可以灵活的用max函数代替if比较
					dp[i] = Math.max(dp[i], dp[j]+1);
					max = Math.max(max, dp[i]);
				}
			}
		}
		
		return max;
	}
	
	// 看A[i]后面能接上哪些数字
	public static int lis3(int[] A){
		
		int[] dp = new int[A.length];		// 对每一个元素存储它的lis
		Arrays.fill(dp, 1);			// 初始化,每个数字本身就是长度为1的lis
		
		// 对每一个数字求其LIS
		for(int i=0; i<A.length; i++){
			// 看A[i]后面能接上哪些数字
			// 如果可以接,找出接完后长度最大那个
			for(int j=i+1; j<A.length; j++){
				// 只有符合递增规律的才能接
				if(A[j] > A[i]){
					dp[j] = Math.max(dp[j], dp[i]+1);
				}
			}
		}
		
		int max = Integer.MIN_VALUE;
		// 现在已经有每个数的LIS,找出最长的那个
		for(int i=0; i<dp.length; i++){
			if(dp[i] > max){
				max = dp[i];
			}
		}
		
		return max;
	}
	
	
}

Ref:

http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/

http://www.csie.ntnu.edu.tw/~u91029/LongestIncreasingSubsequence.html

C/C++ longest increasing subsequence 最长递增子序列算法详解及源码 算法的基本思想是遍历给定序列中的每个元素,记录以该元素结尾的最长递增子序列的长度。通过比较当前元素与前面的元素,可以确定以当前元素结尾的最长递增子序列的长度。在遍历过程中,保持一个数组dp,其中dp[i]表示以第i个元素结尾的最长递增子序列的长度。最长递增子序列(Longest Increasing Subsequence)算法是一种动态规划算法,用于找到一个给定序列中最长的严格递增的子序列。这个子序列可以不连续,但元素的顺序必须保持递增。 阅读详情

相关推荐

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 295

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

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

橙子的博客 743

一文读懂资管系统里的“清算路径”:钱和券的“导航地图”

简单来说,清算路径就是给每一笔交易预设好的“导航路线”。钱从哪个银行账户出?通过哪家证券公司去买?用哪个股东账户去登记?买回来的股票记在谁的名下?“清算路径”就是把这一连串问题的答案提前配置好。它连接了银行托管户(钱的源头)、券商(交易的中介)和交易所(买卖的市场)。没有配好这条路,交易就无法闭环。清算路径是金融基础设施的缩影。资金如何安全地从银行流向市场;资产如何合法地归属到产品名下;交易数据如何在不同系统间流转。它是资管系统能够日复一日、准确无误地处理亿万级交易的基石。

m0_37607945的博客 236

最长递增子序列 Longest Increasing Subsequence (LIS)

题目描述:The longest Increasing Subsequence (LIS) problem is to find the length of the longest subsequence of a given sequence such that all elements of the subsequence are sorted in increasing order. F

IT小菜鸟 541

STM32+OOK通讯(OOK发送+OOK接收)+cubemx配置

关于OOK通信,我的理解就是将要发送的信息转换成高低电平(即0和1),然后接收方通过对01进行解码获得信息。于是我用了非常朴素的字符串转二进制+AM调制来完成通信链。话不多说我们直接开始!!!

qq_73856732的博客 2340

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 421

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

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

long-long-ago 444

Vue3 视频播放器完整指南 – @videojs-player/vue 从入门到精通

全面解析 Vue3 生态中最强大的视频播放解决方案 @videojs-player/vue。从基础安装到高级功能,涵盖自动播放、直播流、字幕支持等核心特性。提供完整的代码示例和最佳实践,助你快速构建专业的视频播放应用。

前端开发-前端技术分享 1422

最长上升子序列(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. 分析: 对于几个给定的数字 a1、a2、... an, 对于从最左边的某一个数开始,按照严格单调递增的顺序到达数ai的路径,将它成为“到

javaMyths的专栏 1025

Anasys Workbanch实战解析:齿轮接触强度有限元分析全流程

本文详细解析了在Anasys Workbanch中进行齿轮接触强度有限元分析的全流程。从模型简化、材料赋予、接触对设置,到网格划分艺术、非线性接触求解调试,再到结果后处理与工程解读,提供了避开常见陷阱的实战经验,旨在帮助工程师精准评估齿轮强度与疲劳寿命。

weixin_29209805的博客 346

项目篇 | 图书管理系统 | 管理员模块 | 概述

图书管理系统管理员模块概述

百栗.的博客 404

动态规划求最长递增子序列(longest increasing subsequence)

1,什么是动态规划? 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段

记录每一个小阶段的学习心得,持之以恒! 6338

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

最长递增子序列(Longest Increasing Subsequence)

定义 最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。 问题描述 给定一个长度为 N 的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为 5 的数组{5, 6, 1, 2, 8},则其最长的单调递增子序列为 {5,6,8},长度为 3。 解法 动态规划 时间复杂度 该方法的时间复杂度为 。 实现过程 下面我们用一个实例来分析一下动态规划求解 LIS 的整个过程。

努力中的老周的专栏 4369

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

算法: 最长递增子序列300. Longest Increasing Subsequence

300. Longest Increasing Subsequence Given an integer array nums, return the length of the longest strictly increasing subsequence. A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing the order of t

AI架构师易筋 4420

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LeetCode - 673. Number of Longest Increasing Subsequence(最长递增子序列的个数)

LeetCode - 673. Number of Longest Increasing Subsequence(最长递增子序列的个数) 题目链接 题目 解析 做这题之前先要知道求一个数组的最长递增子序列。 做法: 求出最长递增子序列的长度(max),可以用记忆化也可以递推; 然后遍历数组,看以哪些数结尾的序列是最长序列,然后对每一个这样的序列进行递归处理,从后往前求以这个结尾的最长序列的个数...

zxzxin的博客~ 369

最长递增子序列 (Longest Increasing Subsequence)

问题描述: 给定一个序列 An = a1,a2,  ... , an,找出最长的子序列使得对所有 i j,ai aj。显然,暴力算法的时间复杂度是 O(2n),因为搜索空间呈指数级增长。对于这种问题,如果要找复杂度为多项式时间的算法,自然而然地会想到动态规划。首先,要找出一种方法

夜鱼的专栏 1万+

算法系列——最长递增子序列(Longest Increasing Subsequence)

Given an unsorted array of integers, find the length of longest increasing subsequence. For example, Given [10, 9, 2, 5, 3, 7, 101, 18], The longest increasing subsequence is [2, 3, 7, 101], therefore the leng

BridgeGeorge 1497

[LeetCode] Longest Increasing Subsequence 最长递增子序列

Given an unsorted array of integers, find the length of longest increasing subsequence. For example, Given[10, 9, 2, 5, 3, 7, 101, 18], The longest increasing subsequence is[2...

weixin_34162401的博客 130

最长递增子序列(Longest Increasing Subsequence)-C语言实现

最长递增子序列 动态规划 C语言

Jasonchen1224的博客 2697

最长递增子序列(Longest increasing subsequence)

问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续)。 这道题共3种解法。 1. 动态规划 动态规划的核心是状态的定义和状态转移方程。定义lis(i),表示前i个数中以A[i]结尾的最长递增子序列的长度。可以得到以下的状态转移方程: d(i) = max(1, d(j) + 1), 其中j < i,且A[j] <=...

weixin_33817333的博客 285

最长递增子序列longest increasing subsequence

Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return the length of the LIS. Have you met this question in a real interview? Example For [5, 4, 1, 2, ...

就是这个七昂的博客 581

动态规划之最长递增子序列(Longest Increasing Subsequence)

原文地址:http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/ We have discussed Overlapping Subproblems and Optimal Substructure properties in Set 1 and Set 2respect

K.Sun 4219

python 实现longest increasing subsequence最长递增子序列算法

输出为4,表示最长递增子序列为[10, 22, 33, 60]。

luthane的博客 668

【小白笔记】最长递增子序列(Longest Increasing Subsequence, 简称 LIS)

结尾的最长 LIS 长度,而是维护一个特殊的数组。时,我们可以向前看所有。这是解决 LIS 问题的。

weixin_70325224的博客 703

Leetcode 最长递增子序列 Longest Increasing Subsequence Java

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

qq_43491066的博客 210
上一篇: NOIP实用算法 4.贪心方法
下一篇: 最长公共子串 Longest Common Subsequence
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值