Java 最长递增子序列-无法理解实际LIS创建

Java 最长递增子序列-无法理解实际LIS创建,java,c,algorithm,dynamic-programming,Java,C,Algorithm,Dynamic Programming,有人能解释一下Peter在文章中给出的最后一个算法吗 我无法获得实际LIS的构造,即父数组将如何构造。 请用彼得举的同样的例子来解释。 提前感谢。在彼得的例子中,最长的递增子序列实际上是“2 3 4 5 8”,导致长度为5 通过查看算法末尾的数组S无法获得LIS,并且S是不是最长的递增子序列 如果我们需要构建LIS,我们将需要存储更多信息并修改所提出的算法。在本文后面的部分中,Peter提到存储parent[i]并将S[i]更改为存储索引而不是值 让我修改他提出的算法,并定义Si以存储数组S中的

有人能解释一下Peter在文章中给出的最后一个算法吗 我无法获得实际LIS的构造,即父数组将如何构造。 请用彼得举的同样的例子来解释。
提前感谢。

在彼得的例子中,最长的递增子序列实际上是“2 3 4 5 8”,导致长度为5

通过查看算法末尾的数组
S
无法获得LIS,并且
S
不是最长的递增子序列

如果我们需要构建LIS,我们将需要存储更多信息并修改所提出的算法。在本文后面的部分中,Peter提到存储
parent[i]
并将
S[i]
更改为存储索引而不是值

让我修改他提出的算法,并定义
Si
以存储数组
S
中的数字索引,以及
parent[i]
array[i]
结尾的LIS中上一个数字的索引。 用他的例子:
array[]={2,6,3,4,1,2,9,5,8}
。请注意,当父数组形成最大长度为1的LIS时,会在父数组中使用
-1

0. S = {} - Initialize S to the empty set
   Si = {}
   parent = {}
1. S = {2} - New largest LIS
   Si = {0}
   parent = {-1}
2. S = {2, 6} - New largest LIS
   Si = {**0**, 1}
   parent = {-1, **0**}
3. S = {2, 3} - Changed 6 to 3
   Si = {**0**, 2}
   parent = {-1, 0, **0**}
4. S = {2, 3, 4} - New largest LIS
   Si = {0, **2**, 3}
   parent = {-1, 0, 0, **2**}
5. S = {1, 3, 4} - Changed 2 to 1
   Si = {4, 2, 3}
   parent = {-1, 0, 0, 2, -1}
6. S = {1, 2, 4} - Changed 3 to 2
   Si = {**4**, 5, 3}
   parent = {-1, 0, 0, 2, -1, **4**}
7. S = {1, 2, 4, 9} - New largest LIS
   Si = {4, 5, **3**, 6}
   parent = {-1, 0, 0, 2, -1, 4, **3**}
8. S = {1, 2, 4, 5} - Changed 9 to 5
   Si = {4, 5, **3**, 7}
   parent = {-1, 0, 0, 2, -1, 4, 3, **3**}
9. S = {1, 2, 4, 5, 8} - New largest LIS
   Si = {4, 5, 3, **7**, 8}
   parent = {-1, 0, 0, 2, -1, 4, 3, 3, 7}
最后,我们得到父数组
{-1,0,0,2,-1,4,3,3,7}

1) 通过查看
S
,我们知道有一个长度为5、在索引8处结束、值为8的LIS。
LIS={?,?,?,?,8}

2) 现在我们看一下索引8的父级,
parent[8]
是7,LIS的前一个成员将在索引7中。这是5号。
LIS={?,?,?,5,8}

3) 现在我们看一下索引7的父级(值5),
parent[7]
为3,LIS的前一个成员将位于索引3中。这是4号。
LIS={?,?,4,5,8}

4) 现在我们看一下索引3的父级(值4),
parent[3]
为2,LIS的前一个成员将位于索引2中。这是3号。
LIS={、3、4、5、8}

5) 现在我们看一下索引2的父级(值3),
parent[2]
为0,LIS的前一个成员将位于索引0中。这是2号。
LIS={2,3,4,5,8}


6) 实际的LIS将是
2 3 4 5 8

你是指
O(N log N)
版本,对吗?例如:
2 6 3 4 1 2 9 5 8
带解决方案
1,2,4,5,8
似乎是错误的,因为在
4
之前,没有子序列按该顺序包含
1,2,4
,没有
1,这并不意味着算法是错误的。@ldgabbay…是的,只有一个..我想了解LIS部分的构造..所以你的意思是他使用的算法没有顺序…比如先得到长度,然后构造实际的LIS?我在上面已经详细阐述了:)非常感谢…我现在知道了…:)