给出一个由 n 个数组成的序列 A[1…n] ,要求找出它的最长单调上升子序列,设 m[i] ( 1 ≤ i ≤ n ),表示以 A[i] 结尾的最长单调上升子序列的长度,则 m[1] = 1 , m[i] ( 1 < i ≤ n )为( )。
给出一个由 n 个数组成的序列 A[1…n] ,要求找出它的最长单调上升子序列,设 m[i] ( 1 ≤ i ≤ n ),表示以 A[i] 结尾的最长单调上升子序列的长度,则 m[1] = 1 , m[i] ( 1 < i ≤ n )为( )。
m[i] = 1 + max{0,m[k](A[k] < A[i],1≤k < i )}
m[i] = 1 + m[k] (k = i - 1 && i > 1)
m[i] = 1 + max{-1,m[k] (A[k] ≤ A[i],1≤k < i )}
m[i] = max{0,m[k](A[k] < A[i],1≤k < i )}
即,是从
,
……到
中找最大的一个值,再加1。或者就是1。主要是看a[i]这个元素能否加入到之前已经获得的最长上升子序列,如果能加入,是之前已获得的最长上升子序列长度加一;如果不能加入,就取这最后一个元素作为一个单独子序列,长度为1。
最后,所要求的整个序列的最长公共子序列长度为max{f(i): 1<=i<=n}
例如,对于序列:4 2 6 3 1 5 2
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
array | 4 | 2 | 6 | 3 | 1 | 5 | 2 |
f(i) | 1 | 1 | 2 | 2 | 1 | 3 | 2 |
对于最长单调上升子序列的长度 m[i],它表示以 A[i] 结尾的最长单调上升子序列的长度。根据定义来看,我们需要考虑在 A[1...i-1] 中所有小于 A[i] 的元素,并找到它们中的最大值,并将其加一。
因此,最长单调上升子序列的长度可以通过以下公式计算:
m[i] = 1 + max{0,m[k](A[k] < A[i],1≤k < i )}
这意味着我们要找到之前所有小于 A[i] 的元素中,以它们为结尾的最长单调上升子序列的长度,并取最大值。然后再将该结果加一,表示将当前元素 A[i] 加入到该子序列中。
选项 B 不正确,因为它仅考虑了前一个元素的最长单调上升子序列的长度,而没有考虑到之前所有小于 A[i] 的元素。
选项 C 也不正确,因为它考虑了不小于 A[i] 的元素,而不是小于 A[i] 的元素。
选项 D 也不正确,因为它没有将最大值加一。