Почнемо з наступного спостереження:
Нехай позначає максимум послідовності , а позначає його мінімум. Якщо , то вибір є оптимальним.з 1 , . . . , a n m i n a 1 = m a x b 1 = b 2 = . . . = b n = ⌊ ( m a x + m i n ) / 2 ⌋maxa1,...,anmina1=maxb1=b2=...=bn=⌊(max+min)/2⌋
Чому це так? Отже, оскільки послідовність починається з максимуму, ми або вибираємо великі, і зазнаємо великого відхилення від мінімуму послідовності (оскільки будь-який наступний повинен бути більшим або рівним ), або ми вибираємо малий і страждаємо від відхилення до . Середнє значення мінімізує максимальне відхилення.b i b 1 b 1 m a xb1bib1b1max
Тепер ми можемо спробувати узагальнити це спостереження для використання на загальних послідовностях . Наприклад, ми можемо розділити будь-яку послідовність на послідовності, так що кожна починається з максимуму відповідної послідовності.a1,...,an
Приклад: на , та .( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)
Враховуючи цей розділ, тепер ми можемо вирішувати кожну ці послідовності окремо і отримувати призначення , що, однак, може порушити умову, що не зменшується. Це можна виправити, не втрачаючи оптимальності.bi
Зауважте, що остання підряд завжди містить максимум всієї послідовності (інакше після неї буде інша послідовність). Нехай - значення, які ми присвоїли послідовностям. Тепер, щоб досягти зменшення в , ми починаємо з тилу і працюємо на фронт. Якщо більше, ніж , ми просто встановлюємо . Якщо вона менша, ми зберігаємо її. Потім переходимо до порівняння з і так далі. Зауважте, що зниження будь-якого до значенняmaxw1,w2,...,wkkw1,...,wkwkwk−1wkwk−1:=wkwk−2wk−1wiwi+1ніколи не збільшує відхилення, оскільки значення максимуму в присвоєній , завжди нижче максимального в присвоєній .wiwi+1
Цей алгоритм повинен бути правильним, я думаю. Щодо часу виконання, ключовим кроком є обчислення зростаючих максимумів для підрядів, що можливо в ? Не впевнений, куди вносить свій внесок.O(n)l