Тихие кварталы

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

Условие

Ночной дрон летит над прямой улицей из n кварталов. В i-м квартале можно забрать трофеи на сумму a_i.

Но система наблюдения устроена так: если забрать трофеи в двух соседних кварталах, тревога сработает. Дрон хочет собрать как можно больше и остаться незамеченным.

Обратите внимание: суммы могут не помещаться в 32-битный тип (как на олимпиадах), используйте 64-битные целые. В Python это не проблема.

Формат ввода

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

Выведите одно число — максимальную сумму, которую можно собрать, не выбирая два соседних квартала.

Ограничения

Пример

Ввод:

5
2 7 9 3 1

Вывод:

12

(например, можно взять кварталы 1, 3 и 5: 2 + 9 + 1 = 12)

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

Приём: Динамическое программирование по префиксу (1D) + O(1) память

Ключевое наблюдение: выбор в квартале i влияет только на квартал i-1 (соседний). Значит, чтобы посчитать лучший результат для первых i кварталов, достаточно знать лучший результат для первых i-1 и i-2.

Приём: динамическое программирование (ДП) по префиксу. Оно работает, потому что у задачи есть «оптимальная подструктура»: оптимальный набор на первых i кварталах строится из оптимальных наборов на меньших префиксах.

Обозначим dp[i] — максимальная сумма, которую можно собрать среди кварталов 1..i без соседей. Тогда есть два варианта для i-го квартала:

Значит, переход: dp[i] = max(dp[i-1], dp[i-2] + a[i]).

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

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

Частая ошибка: неверная база и индексация (особенно при переходе от 1-индексации в условии к 0-индексации в Python). Убедитесь, что для i=1 и i=2 формулы работают корректно.

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

Куда дальше