Разбор
Перенумеруем дома начиная с первого индекса (-ый дом содержит денег). Пусть — максимальная сумма добычи после грабежа домов с по -ый.
Тогда .
При вычислении рассмотрим два случая:
если -ый дом грабится, то -ый дом трогать нельзя. В таком случае прибыль составит .
если -ый дом не грабится, то прибыль составит .
Таким образом
Запомним значения в массиве . Ответом задачи будет значение .
Пример
Рассмотрим вычисление . Если третий дом мы не грабим, то прибыль составит . Если третий дом грабится, то можно ограбить первый дом, получив прибыль плюс прибыль за ограбление третьего дома, равную (общая прибыль составит ).
Рассмотрим вычисление . Если четвертый дом мы не грабим, то прибыль составит . Если четвертый дом грабится, то можно ограбить первые два дома, получив прибыль плюс прибыль за ограбление четвертого дома, равную (общая прибыль составит ).
Упражнение
Вычислите значения для следующих входных данных:
Реализация алгоритма
Объявим входной массив и результирующий .
#define MAX 1000001 long long a[MAX], res[MAX];
Читаем входные данные.
scanf("%d",&n); for(i = 1; i <= n; i++) scanf("%lld",&a[i]);
Вычисляем ответ для одного и двух домов.
res[1] = a[1]; if (n > 1) res[2] = max(a[1],a[2]);
Вычисляем ответы для остальных домов.
for(i = 3; i <= n; i++) res[i] = max(res[i - 2] + a[i], res[i - 1]);
Выводим ответ.
printf("%lld\n",res[n]);
Java реализация
import java.util.*; class Main { static long a[] = new long[1000001]; static long res[] = new long[1000001]; public static void main(String[] args) { Scanner con = new Scanner(System.in); int n = con.nextInt(); for(int i = 1; i <= n; i++) a[i] = con.nextInt(); res[1] = a[1]; if (n > 1) res[2] = Math.max(a[1],a[2]); for(int i = 3; i <= n; i++) res[i] = Math.max(res[i - 2] + a[i], res[i - 1]); System.out.println(res[n]); con.close(); } }
Python реализация
Читаем входные данные.
n = int(input()) lst = list(map(int,input().split()))
Инициализируем список .
dp = [0] * len(lst)
Вычисляем ответ для одного и двух домов.
dp[0] = lst[0] if (n > 1): dp[1] = max(lst[0], lst[1])
Вычисляем ответы для остальных домов.
for i in range(2, len(lst)): dp[i] = max(dp[i-1], dp[i-2] + lst[i])
Выводим ответ.
print(dp[-1])