美文网首页
45打家劫舍

45打家劫舍

作者: Jachin111 | 来源:发表于2020-08-25 12:58 被阅读0次

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

    示例 1:
    输入:[1,2,3,1]
    输出:4
    解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
    偷窃到的最高金额 = 1 + 3 = 4 。

    示例 2:
    输入:[2,7,9,3,1]
    输出:12
    解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
    偷窃到的最高金额 = 2 + 9 + 1 = 12 。

    提示:
    0 <= nums.length <= 100
    0 <= nums[i] <= 400
    动态规划
    定义子问题,写出子问题的递推关系,确定 DP 数组的计算顺序,空间优化

    class Solution:
        def rob(self, nums: List[int]) -> int:
            prev = 0
            curr = 0
        
            # 每次循环,计算“偷到当前房子为止的最大金额”
            for i in nums:
                # 循环开始时,curr 表示 dp[k-1],prev 表示 dp[k-2]
                # dp[k] = max{ dp[k-1], dp[k-2] + i }
                prev, curr = curr, max(curr, prev + i)
                # 循环结束时,curr 表示 dp[k],prev 表示 dp[k-1]
    
            return curr
    

    动态规划+贪心算法

    class Solution:
        def rob(self, nums: List[int]) -> int:
            a, b = 0, 0
            for i in nums:
                a, b = b, max(b, a+i)
            return b
    

    来源:力扣(LeetCode)

    相关文章

      网友评论

          本文标题:45打家劫舍

          本文链接:https://www.haomeiwen.com/subject/pkaajktx.html