動態規劃 打家劫舍 簡單

# 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]
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章