如何找到以特定元素结尾的最长增加子序列导致找到LIS的解决方案

时间:2017-04-05 16:36:47

标签: algorithm dynamic-programming

我已经明白为了找到LIS问题的解决方案,我们需要找到每个子序列的LIS,从数组的初始元素开始到以特定元素(最后一个元素)结尾的每个元素,但我是我无法理解如何最终找到一个给定的未排序数组的LIS,我也明白这会导致最优的子结构属性然后可以解决,但如上所述,我不知道如何找到LIS(j)以arr [j]结尾将有助于我们。

感谢。

1 个答案:

答案 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 LIS3 2 LIS。请注意,即使2具有相同的20,也不会再次出现平局。这是因为LIS高于20。最后,我们找到5 1 LIS,完成序列:

1

反转这会产生最长的增加子序列:

50  8  6  5  2  1

这是一个常见的技巧:给定一个表格,其中包含您正在最大化的函数的值(即长度),您可以通过反向跟踪步骤来产生产生此函数的答案(即序列本身)。算法到初始元素。