该问题均使用动态规划来解决
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 ) 。选中的元素的下标记

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

被折叠的 条评论
为什么被折叠?



