我已经明白为了找到LIS问题的解决方案,我们需要找到每个子序列的LIS,从数组的初始元素开始到以特定元素(最后一个元素)结尾的每个元素,但我是我无法理解如何最终找到一个给定的未排序数组的LIS,我也明白这会导致最优的子结构属性然后可以解决,但如上所述,我不知道如何找到LIS(j)以arr [j]结尾将有助于我们。
感谢。
答案 0 :(得分:1)
以此序列为例:
a[] : 10 20 1 2 5 30 6 8 50 5 7
它产生以下LIS[i]
:
a[] : 10 20 1 2 5 30 6 8 50 5 7
LIS[] : 1 2 1 2 3 4 4 5 6 3 4
根据此序列,您可以立即找到结果的长度及其最后一个元素:长度为6,最后一个元素为50.
现在,您可以从后面开始展开序列的其余部分:查找LIS
的{{1}}(比元素5
少一个),使得数量更少比50
收益率更高8.再回顾50
会给你4
(没有平局,因为6
高于30
)。接下来是8
5
LIS
,3
2
LIS
。请注意,即使2
具有相同的20
,也不会再次出现平局。这是因为LIS
高于20
。最后,我们找到5
1
LIS
,完成序列:
1
反转这会产生最长的增加子序列:
50 8 6 5 2 1
这是一个常见的技巧:给定一个表格,其中包含您正在最大化的函数的值(即长度),您可以通过反向跟踪步骤来产生产生此函数的答案(即序列本身)。算法到初始元素。