Проблема –
Вы профессиональный грабитель, планирующий грабить дома по улице. Каждый дом имеет определенное количество денег, замеченных денег, единственное ограничение, останавливая вас от ограбления каждого из них, заключается в том, что примыкающие дома имеют соединение системы безопасности, и она автоматически свяжется с полицией, если два соседних дома были разбиты в ту же ночь.
Учитывая список неотрицательных целых чисел, представляющих сумму денег каждого дома, определить максимальную сумму денег, которую вы можете грабить сегодня без предупреждения полиции
Пример = “” “вход: nums = [1,2,3,1] Выход: 4 Объяснение: грабить дом 1), а затем грабить дом 3). Общая сумма вы можете +. ” «Интуиция – один подход может быть жадным точком.
Однако мы можем пропустить здесь некоторые случаи, так как мы не знаем, какие ценности лежат в будущем. Рассмотрим следующий сценарий – [2,4,8,40]
Если мы жадным, мы выберем 8. Но если мы выберем 4, мы сможем выбрать 40, а результат будет 44. Итак, жадный не будет работать здесь. Нам нужно перечислить все возможности/состояния. Итак, мы сделаем это. И мы будем использовать мемузаризацию, чтобы уменьшить сложность времени. И поскольку мы используем мемузаризацию, мы срок его как решение DP. Решение –
class Solution: def rob(self, nums: List[int]) -> int: cache = {} def dp(idx): if idx < 0: return 0 else: res = cache.get(idx, None) if res is not None: return res else: res = max(dp(idx-1), dp(idx-2) + nums[idx]) cache[idx] = res return res return dp(len(nums)-1)
Оригинал: “https://dev.to/skbhagat40/leetcode-september-day14-19oi”