动态规划——最长上升子序列

动态规划——最长上升子序列(LIS) 聪明人都会点进来学习!!动态规划看这一篇就够了!!!本文详细讲解了动态规划的核心思路(配有图片),还以经典问题——最长上升子序列为例,先从基础解法开始讲解思路,再一步步优化,带有完整代码(有详细注释),对于难以理解的地方还会举例讲解,还会对比思考,赶紧点进来学习吧!!! 阅读详情
最长上升子序列(Longest increasing subsequence)

问题描述
        对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足{s1<s2<s3<…<sm}。求A的最长子序列的长度。

动态规划法

算法描述:
        设数串的长度为n,L[i]为以第i个数为末尾的最长上升子序列的长度,a[i]为数串的第i个数。
        L[i]的计算方法为:从前i-1个数中找出满足a[j]<a[i](1<=j<i)条件的最大的L[j],L[i]等于L[j]+1。
动归表达式:


代码实现:

int LIS(int a[], int n)
{
	int len[MAXSIZE];
	int i, j;
	int maxlen = 0;
	//计算以第i个数为结尾的最长上升子序列的长度
	for (i = 1; i <= n; i++)
	{
		len[i] = 0;
		//从前i-1个数中找出满足a[j]<a[i](1<=j<i)条件的最大的L[j]
		for (j = i-1; j >= 1; j--)
		{
			if (a[j] < a[i] && len[j] > len[i])
			{
				len[i] = len[j];
			}
		}
		len[i]++;

		if (len[i] > maxlen)
		{
			maxlen = len[i];
		}
	}
	return maxlen;
}

上述算法的时间复杂度为O(n2)。

改进算法:
        在从前i-1个数中找出满足a[j]<a[i](1<=j<i)条件的最大的L[j]的时间复杂度为O(n),这里采用二分查找的方法对它进行优化,使其复杂度降为O(nlogn)。
        增设一个m[]数组,m[x]存放长度为x的最长上升子序列的最小末尾数。例:m[3] = 17表示长度为3的最长上升子序列的最小末尾数为17。
        由于子序列是上升的,所以m数组中的元素有一个性质,当x<y时,m[x]<m[y],利用这个性质来使用二分查找。
设m数组所存储的最长上升子序列的长度为k,当前计算的数为第i个
如果a[i]>m[k],则m[++k]=a[i];
否则在m[1~k]内二分查找小于(等于)a[i]的最大值的位置p,m[p]=a[i]。

代码实现:

int BSearch(int a[], int n, int t)
{
	int low = 1;
	int high = n;
	
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (t == a[mid])
		{
			return mid;
		}
		else if (t > a[mid])
		{
			low = mid + 1;
		}
		else
		{
			high = mid - 1;
		}
	}
	return low;
}

int LIS_BSearch(int a[], int m[], int n)
{
	int maxlen = 1;		//最长上升子序列的长度
	m[maxlen] = a[1];

	int i;
	for (i = 2; i <= n; i++)
	{
		if (a[i] > m[maxlen])
		{
			m[++maxlen] = a[i];
		}
		else
		{
			//返回小于a[i]的最大值的位置p
			int p = BSearch(m, maxlen, a[i]);
			m[p] = a[i];
		}
	}
	return maxlen;
}

改进后的算法时间复杂度为O(nlogn)。
图解动态规划:最长上升子序列 最长上升子序列(300) 在上一篇中,我们了解了什么是DP(动态规划),并且通过DP中的经典问题 “最大子序和”,学习了状态转移方程应该如何定义。在本节中,我们将沿用之前的分析方法,通过一道例题,进一步巩固之前的内容! 01、题目分析 第300题:最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种 阅读详情

相关推荐

最长上升子序列(动态规划)

子序列 所谓的子序列就是在原来序列中找出一部分组成的序列。 与子段不同,不需要连续的某一段,但是要保持原序列的先后顺序 最长上升子序列 在子序列的基础上,后一项大于前一项。 【题目描述...

syc_36的博客 3658

LIS 最长上升子序列N^2以及nlogn算法

<br />这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。<br /><br />A.<br />O(n^2)算法分析如下: <br /><br />(a[1]...a[n] 存的都是输入的数) <br />1、对于a[n]来说,由于它是最后一个数,所以当从a[n]开始查找时,只存在长度为1的不下降子序列; <br />2、若从a[n-1]

1896

动态规划之最长上升子序列LIS

同学们,刚刚学完的线性DP好玩吗,现在,我们一起来学习动态规划的第二个知识点——最长上升子序列。 最长上升子序列,简称为LIS,顾名思义,就是求序列中任意一段子序列,要求他持续上升。 如果用普通的贪心算法,我们很容易就会超时,所以,我们就一起来学如何用动态规划来完成最长 上升子序列问题。 问题A最长上升子序列(模板题) Description 一个数的序列 bi,当 b1 < b2 < ... < bS 的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a.........

Tom_JO的博客 807

最长上升子序列(Java)

题目 方法一: public static int getMax(int n,int[]a){ //记录最长上升子序列问题 int [] dp = new int[n]; int res = 0 ; int maxj = 0; //记录上升序列的最后的一个值 for (int i = 0; i < n; i++) { res++; //将自身加进去 maxj = a[i

qq_43404873的博客 1162

动态规划:最长上升子序列(java)

最长上升子序列:要求球数组当中严格递增的子序列,可以不连续。 思路:设一个数组,保存以当前元素结尾的最长递增子串。 例如,1结尾的最长递增子串是1个元素,3结尾的最长递增子串是2各元素,2结尾的最长递增子串是2各元素,计算5结尾的时候,先求max之前所有元素的最长递增子串,然后1<5,所以生成2,。3<5,所以生成3。2<5,所以生成3,所以5的位置上是3. 再看1, imp...

qq_38888209的博客 1877

C++动态规划算法之最长上升子序列

最长上升子序列 Description一个数的序列bi,当b1 b2 bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 i2 < ... < iK 你的任务,就是对于给定的序列,求出最长上升子序列的长度。 Input输入的第一行

The most secret blogs 2185

【leetcode】300.最长上升子序列(动态规划多种解法, java实现)

300. 最长上升子序列 难度中等 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。 进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? 分析 首先,需要对「子序列」和「子串」这两个概念进行区分; 子序列(subsequen

Viper的程序员修炼手册 1264

局放起始电压(PDIV)与击穿电压(BDV):绝缘系统设计的核心参数 [特殊字符]

在电力设备绝缘系统设计中,**局放起始电压(Partial Discharge Inception Voltage, PDIV)和击穿电压(Breakdown Voltage, BDV)**是两个至关重要的参数。它们直接反映了绝缘材料的性能和绝缘系统的可靠性,对变压器的设计、制造和运行具有重要指导意义。本文将深入探讨这两项参数的定义、测试方法及其与绝缘设计制造的关系,帮助读者全面理解其在电力设备中的核心作用。

mubiao05的博客 2629

最长上升子序列java实现

算法 最长子序列

lb521200200的专栏 2452

ElaticSearchUtil工具类封装

package com.xxx.util; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; import org.elasticsearch.action.admin.indices.analyze.AnalyzeAction; import org.elasticsearch.action.ad

会飞的狼 6295

VNC Viewer建立多个图形界面,来远程访问同一个服务器(Ubuntu)

如题。目前已经有了一个VNC viewer连接,那么如果再开一个图形界面呢? 思路主要是:新建一个用户,从这个用户新建一个vnc连接,然后访问图形界面。

the Blog of 等不到天亮丶等时光 5899

最长上升子序列(O(nlogn))

最长上升子序列的解法(O(nlogn)) 实现

sdau20163940的博客 994

RK3576开发板ROS2部署实战:从Buildroot配置到Hello World Demo

本文详细介绍了在RK3576开发板上部署ROS2的完整实战流程。从Buildroot工程配置、集成ROS2依赖,到搭建Docker交叉编译环境、处理编译难题,最终完成系统镜像打包并在板端成功运行Talker-Listener Demo。该指南旨在帮助开发者深入理解嵌入式机器人系统的构建链,实现从底层到应用的完全掌控。

mac99的博客 1149

C++动态规划之最长上升子序列

从图1中可以看出,在遍历素组中的元素时,如果该元素的值大于该元素之前的元素值时,就有可能构成上升子序列,此时需要找到之前元素对应的最长子序列的长度,找到这些长度的最大值,并且对该最大值加1,即为当前元素对应的最长子序列。例如序列A={1,3,5,4,2},删除其中的第3项和第5项,得到序列B={1,3,4},删除其中的第3项和第4项,得到序列C={1,3,2},此时序列B和C是序列A的子序列。例如,序列D={1,5},是序列A的上升子序列,但不是最长上升子序列,而序列B是A的最长上升子序列。

hou09tian的博客 8262

抑制电磁干扰(EMI)的实用电路技术

抑制电磁干扰(EMI)的实用电路技术 qtFK_EMC_EMI 【导读】本系列文章的第 1 部分至第 4 部分详细介绍了开关电源稳压器引起的传导发射和辐射发射,包括噪声产生机制、测量要求、频率范围、适用的测试限值、传播模式和寄生效应。在第 5 部分中,我将基于这一理论基础介绍抑制电磁干扰 (EMI) 的实用电路技术。 一般来说,电路原理图和印刷电路板 (PCB) 对于实现出色的 EMI 性能至关重要。第 3 部分重点强调通过谨慎的元器件选型和 PCB 布局尽量减小“功率回路”寄生电感的重要性。电源转换

学海无涯的专栏 1188

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3593

动态规划——最长上升子序列模型

动态规划——最长上升子序列模型

pangyou3s的博客 2432

GNN(图神经网络)的 MATLAB 仿真

图神经网络(Graph Neural Network, GNN)是一种用于处理图结构数据的深度学习模型。GNN 通过聚合节点及其邻居的信息,能够有效捕捉图结构中的复杂关系,广泛应用于社交网络分析、推荐系统、化学分子分析等领域。GNN 通过消息传递机制聚合节点及其邻居的信息,能够有效处理图结构数据。MATLAB 仿真展示了 GNN 的基本流程和节点分类性能,适用于社交网络分析、推荐系统、化学分子分析和知识图谱等多种应用场景。

走向CTO的路上... 837

动态规划—最长上升子序列(POJ 1458)

本文主要介绍了 经典算法题 最长上升子序列的动态规划解法,同时用北大OJ的案例来补充说明,意在学习动态规划的基本思想和解题过程,供大家一起学习!

青春无问西东 岁月自成芳华 5040

利用dddd_trainer训练通用验证码识别模型

博文介绍了使用dddd_trainer工具训练自定义验证码识别模型的过程,详细展示了从环境搭建、数据集准备到模型训练的全流程。

九月镇灵将的博客 1033

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

动态规划解最长上升子序列(全)

1、动态规划问题导览: 最长上升子序列(longest  increasing subsequence)问题,也可以叫最长非降序子序列,简称LIS。是动态规划算法的一个经典应用。 我们都知道,动态规划的一个特点就是当前解可以由上一个阶段的解推出, 由此,把我们要求的问题简化成一个更小的子问题。子问题具有相同的求解方式,只不过是规模小了而已。最长上升子序列就符合这一特性。我们要求n个数的最长上...

相由心生的博客 5549

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【洛谷 B3637】最长上升子序列 题解(动态规划+最长上升子序列)

这是一个简单的动规板子题。给出一个由nn≤5000个不超过106的正整数组成的序列。请输出这个序列的的长度。最长上升子序列是指,从原序列中取出一些数字排在一起,这些数字是的。

HEX9CF的技术博客 1850

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

线性动态规划总结--最长上升子序列

线性动态规划总结 线性动态规划的相关问题主要有以下几个分类: 最长上升子序列(LIS)和最长下降子序列 最长字段和 最长公共子序列(LCS) 子串和子序列的区别 LIS的两种方法(原版+二分改进版) LCS的两种方法(原版二维数组+改进版) ...

kkkkkkkaaak的博客 469

Java实现最长上升子序列(动态规划)

问题: 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为O(n2) 。 思路: 我们可以使用动态规划来进行解答 1,设置dp[]数组...

小仙女的博客 6559

动态规划之 —— 最长上升子序列问题(一)

最长上升子序列问题也叫做LIS(LIS : longest increasing sequence) 最长上升子序列,顾名思义就是找到一串数组中,严格单调上升的子序列最大长度。 原题链接 (代码粘贴即可通过) 首先举个例子: 假如给定数组: [3 1 2 1 8 5 6] ,问题是找出这组数的最长上升子序列的长度。 很显然,使用暴力是很难去解决这道问题的,所以就使用到了动态规划。 对于这道题目,我们需要一个dp数组,来记录上升子序列的长度。 dp[i]表示以第i个数结尾的上升子序列的长度,那么我们最终要

qq_45260619的博客 4550
上一篇: 贪心算法——NY 14 会场安排问题
下一篇: 动态规划——Poj 1159 Palindrome
庞老板
博客等级 码龄15年 127粉丝 66原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值