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