Letcode 9월 14일
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police
예 =
"""
입력:nums=[1,2,3,1]
산출: 4
설명: 먼저 집 1(돈=1)을 털고, 그 다음에 집 3(돈=3)을 털는다.
네가 약탈할 수 있는 총 금액은 1+3=4이다.
"""
직감 - 탐욕스러울 수도 있다. 즉, 세 가지 가능성 중에서 최대치를 선택한 다음 계속 전진하고, 다른 세 가지 가능성 중에서 최대치를 선택하는 것이다.
그러나 미래의 가치관이 무엇인지 모르기 때문에 우리는 몇 가지 사례를 놓칠 수 있다.
다음 시나리오 고려 -
[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)
Reference
이 문제에 관하여(Letcode 9월 14일), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/skbhagat40/leetcode-september-day14-19oi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)