Я предполагаю:
- Вам совершенно не важна длина подпоследовательности.
- Подпоследовательности не должны быть смежными
Это составляет мир разницы!
Решение
Пусть оптимальное множество S
извозрастающие подпоследовательности (IS) для массива A
представляют собой набор IS, такой, что для каждого IS s
в A
мы имеем ровно одно из:
s
в в S - В
S
есть IS s'
, такой что sum(s')
> = sum(s)
и largest_element(s')
<= <code>largest_element(s)
Оптимальный набор S
может быть упорядочен как по наибольшему элементу подпоследовательностей, так и по их сумме - порядок должен быть одинаковым.Это то, что я имею в виду под наименьшей / наибольшей последовательностью позже.
Наш алгоритм должен затем найти оптимальный набор A
и вернуть его наибольшую последовательность.S можно вычислить следующим образом:
S := {[]} //Contains the empty subsequence
for each element x in A:
s_less := (largest sequence in S that ends in less than x)
s := Append x to s_less
s_more := (smallest sequence in S that has sum greater than s)
Remove all subsequences in S that are between s_less and s_more
(they are made obsolete by 's')
Add s to S
Самая большая подпоследовательность в S является самой большой подпоследовательностью в массиве.
Каждый шаг может быть реализован в O (log n), если S является сбалансированнымбинарное дерево.N шагов дают O (n * log n) общей сложности.
Предостережение: вполне вероятно, что в моем псевдокоде может быть несколько ошибок + - 1 - их нахождение оставлено читателю в качестве упражнения.:)
Я постараюсь привести конкретный пример .Может быть, это поможет прояснить идею.Подпоследовательность, расположенная справа, всегда самая лучшая, но остальные - потому что в будущем они могут вырасти до самой тяжелой последовательности.
curr array | Optimal Subsequences
[] []
//best this we can do with 8 is a simgleton sequence:
[8] [] [8]
//The heaviest sequence we can make ending with 12 is [8,12] for a total of 20
//We still keep the [8] because a couble of 9s and 10s might make it better tahn 8+12
[8,12] [] [8] [8,12]
[8,12,11] [] [8] [8,11] [8,12]
[8,12,11,9] [] [8] [8,9] [8,11] [8,12]
//[8,9,10] makes [8,11] and [8,12] obsolete (remove those).
//It not only is heavier but the last number is smaller.
[8,12,11,9,10] [] [8] [8,9] [8,9,10]