Серия на табло

тема: DP 1D · уровень: средний

Условие

На школьном турнире по лёгкой атлетике тренер записал «настроение команды» по минутам: иногда ребята добавляют уверенности (плюс), иногда теряют (минус). Тренер хочет выбрать один непрерывный отрезок минут — так, чтобы суммарный подъём настроения за этот отрезок был максимальным.

Важно: отрезок должен быть непустым.

Формат ввода

В первой строке дано целое число n — количество минут. Во второй строке дано n целых чисел a1, a2, ..., an — изменение настроения по минутам.

Формат вывода

Выведите одно целое число — максимальную возможную сумму на непустом непрерывном отрезке.

Ограничения

Пример

Ввод:

8
-2 3 1 -5 4 2 -1 3

Вывод:

8

(Максимум даёт отрезок 4 2 -1 3.)

Как решать — идея подхода

Приём: ДП по префиксу (алгоритм Кадане)

Ключевое наблюдение: если мы хотим максимум на непрерывном отрезке, достаточно идти слева направо и для каждой позиции знать ответ на вопрос: «какая максимальная сумма непустого отрезка, который ОБЯЗАТЕЛЬНО заканчивается здесь?»

Почему это работает: отрезок, заканчивающийся в i, либо

Если предыдущая сумма стала отрицательной, тащить её дальше вредно — выгоднее стартовать с текущего элемента.

План решения:

Сложность: O(n) по времени и O(1) по памяти.

Частая ошибка: инициализировать best нулём. Отрезок должен быть непустым, поэтому при всех отрицательных числах ответ — максимальный (наименее отрицательный) элемент, а не 0.

Решить задачу с автопроверкой на Python →

Куда дальше