# 198. 打家劫舍
# https://leetcode-cn.com/problems/house-robber/
""" 思路
1.簡單情況:
如果只有一個房子, 肯定要偷。
如果有兩個房子,肯定要偷財產多的
如果有三個房子呢? A B C三個房子
此時會有兩種選擇,一種是偷A和C, 另一種是偷B
如果A + B greater than B, 要選擇偷AC,否則偷B
也就是說,C位置的時候,考慮是A+C大呢還是B大的問題。 OK?
即dp[C] = max(dp[A] + nums[c], dp[B])
假設dp[i]代表到當前位置i的時候做出的最優的選擇,
那麼
dp[i] = max(dp[i-2] + nums[c], dp[i-1]
2.直接考慮也行:
dp[i]表示到第i個位置,偷到的最大數量
在第i個位置,有兩種選擇:
1. 偷
2. 不偷
dp[i] = max( dp[i-2] + nums[i], 偷了第i個位置, 要想最大話,肯定也要偷之前位置,但是不能是相鄰的位置
dp[i-1] 沒偷第i個位置
)
### 完整代碼
class Solution:
def rob(self, nums):
if not nums or len(nums) == 0:
return 0
if len(nums) < 3:
return max(nums)
dp = [0 for i in range(len(nums))]
dp[0] = nums[0]
for i in range(1, len(nums)):
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
print(dp)
return dp[len(nums)-1]
動態規劃 打家劫舍 簡單
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.