LeetCode 198 [House Robber]

原題

假設(shè)你是一個(gè)專業(yè)的竊賊,準(zhǔn)備沿著一條街打劫房屋。每個(gè)房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯(lián)系的防盜系統(tǒng),且 當(dāng)相鄰的兩個(gè)房子同一天被打劫時(shí),該系統(tǒng)會(huì)自動(dòng)報(bào)警
給定一個(gè)非負(fù)整數(shù)列表,表示每個(gè)房子中存放的錢, 算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動(dòng)報(bào)警裝置的情況下

樣例
給定 [3, 8, 4], 返回 8.

解題思路

  • 單序列型動(dòng)態(tài)規(guī)劃
  • dp[i]代表前i個(gè)房子能獲得的最大價(jià)值,所以dp[i] = max(dp[i-1], dp[i-2] + nums[i])
  • 可以使用滾動(dòng)數(shù)組優(yōu)化

完整代碼

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        if len(nums) == 1:
            return nums[0]
        dp = [0 for i in range(len(nums))]
        dp[0], dp[1] = nums[0], max(nums[0], nums[1])
        for i in range(2, len(nums)):
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
        return dp[len(nums) - 1]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容