最长递增子序列的求解(O(n*n),O(nlogn))——动态规划

本文详细介绍了如何使用动态规划在O(n*n)和O(nlogn)的时间复杂度下解决最长递增子序列问题。通过描述最优子结构、递归解法以及实现代码,解释了两种不同复杂度下的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该问题均使用动态规划来解决

1.在O(n*n)的复杂度下求解最长递增子序列


1) 描述最优子结构

序列中每个元素维护两个额外信息量,均假设当前元素(i)是 (0~i-1)个元素子序列中作为递增子序列的最后一个元素,则维护当前元素最后最后一个元素的递增子序列的长度,并维护该序列中当前元素的前一个元素。

如:
{1,5,6,7,3} 中,元素1 维护的信息量分别为:

(1)从0~0的子序列中,1作为最后一个元素的递增子序列的长度。即是 {1} ,记做len(0)

(2)该元素的前一个递增元素的下标,对第0号元素,初始前一个元素为-1(结束条件),记做 prev(0)

类似的,对元素 5 维护的信息量为:

(1) 2。以 5 作为最后一个元素的递增子序列的长度为2 ,即有 {1,5}

(2)0。即当前元素的前一个递增元素的下标:即值1的下标。所以为0


则对第 i 个元素,要直到以第 i 个元素为最后一个元素的最长递增子序列的长度,应该遍历 0 ~ i - 1 个元素,找到其中 val(k) < val(i) 且 len(k) 最大的 k值,将第 i 个元素接在第 k 个元素之后,形成一个新的以 i 个元素结尾的最长递增子序列


2)递归解

根据上述描述,得到如下的递归式子,对于第 i 个元素, val(i) 描述该元素的值,len(i) 描述以该元素为最后一个元素的最长递增子序列的长度的。prev(i) 表示该递增子序列的前一个元素的下标。则递归式如下:

len(i) =  max{len(j)}  +1, if j ∈(0, i - 1) 且 val( j ) < val( i ) 。选中的元素的下标记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值