【leetcode系列】【算法】【简单】打家劫舍(基础DP)

题目:

题目链接: https://leetcode-cn.com/problems/house-robber/

解题思路:

动态规划

如果只有最后一家房屋,那么偷取的最高金额只有一种

如果只有最后两家房屋,偷取最高金额的方式也只有一种,就是偷取钱多的一家

从倒数第三家开始,偷取的方式变为了:偷取当前家和最后一家,或者只偷取倒数第二家两种

所以动态规划的状态转移公式为:

dp[i] = max(money[i] + dp[i + 2], dp[i + 1])

最后dp[0]就是可以偷取的最大钱数

代码实现:

class Solution:
    def rob(self, nums: List[int]) -> int:
        if 0 == len(nums):
            return 0
        elif 2 >= len(nums):
            return max(nums)
        
        dp = [0] * len(nums)
        dp[-1] = nums[-1]
        dp[-2] = max(nums[-1], nums[-2])
        for index in range(len(nums) - 3, -1, -1):
            dp[index] = max(nums[index] + dp[index + 2], dp[index + 1])
        
        return dp[0]
发布了114 篇原创文章 · 获赞 11 · 访问量 1663

猜你喜欢

转载自blog.csdn.net/songyuwen0808/article/details/105424411