Я также думаю, что приведенное объяснение не очень ясно.Вот еще один вариант.
Вы можете свернуть исходный массив
1 1 2 2 2 1 1 2 2 1
в взвешенный массив
2 3 2 2 1
^ ^ ^ ^ ^
1 2 1 2 1
, где числа вверху представляют длины смежных полосповторяющиеся значения в исходном массиве.
Мы можем убедить себя в том, что
- Оптимальное отражение не «разбивает» никакие смежные последовательности.
- Оптимальное начало запускаи заканчивается различными значениями (т. е. начинается с 1 и заканчивается 2 или начинается с 2 и заканчивается 1).
Следовательно, взвешенный массив содержит достаточно информации для решения проблемы.Мы хотим перевернуть непрерывный фрагмент взвешенного массива, чтобы сумма весов, связанная с некоторой непрерывной монотонной последовательностью, была максимальной.
В частности, мы хотим выполнить переворот таким образом, чтобы некоторая непрерывная монотонная последовательность 112
, 122
, 211
или 221
имеет максимальный вес.
Один из способов сделать это с помощью динамического программирования - создать 4 вспомогательных массива.
A[i]
: максимальный вес любого 1 справа от i. B[i]
: максимальный вес любого 1 слева от i. C[i]
: максимальный вес любого 2 отсправа от i. D[i]
: максимальный вес любых 2 слева от i.
Предположим, что если любой из A,B,C,D
доступен вне границ,возвращается значение 0
.
Мы инициализируем x = 0
и делаем один проход через массив Arr = [1, 2, 1, 2, 1]
с весами W = [2, 3, 2, 2, 1]
.На каждый индекс i
у нас есть 2 случая:
Arr[i:i+2] == 1 2
.В этом случае мы устанавливаем x = max(x, W[i] + W[i+1] + C[i+1], W[i] + W[i+1] + B[i-1])
.
Arr[i:i+2] == 2 1
.В этом случае мы устанавливаем x = max(x, W[i] + W[i+1] + A[i+1], W[i] + W[i+1] + D[i-1])
.
Полученный x
является нашим ответом.Это решение O (N).