【动态规划-BM79 打家劫舍(二)】

题目

BM79 打家劫舍(二)
描述
你是一个经验丰富的小偷,准备偷沿湖的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家,如果偷了第二家,那么就不能偷第一家和第三家。沿湖的房间组成一个闭合的圆形,即第一个房间和最后一个房间视为相邻。
给定一个长度为n的整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。

在这里插入图片描述

分析

【动态规划-BM78 打家劫舍(一)】的区别是最后一家与第一家相连成环。

这时,第一家与最后一定有一个是一定不取的,分两种情况讨论。

当取第一家时,只需在原有基础上,不要遍历到最后一家即可,ans=dp[n-1]
当不取第一家时,dp[1] = 0, 遍历到最后一家,ans = dp[n]

取两种情况的最大值。

代码

class Solution:
    def rob(self , nums: List[int]) -> int:
        # write code here
        n = len(nums)
        dp = [0]*(n+1)
        # 取第一家
        dp[1] = nums[0]
        # 最后一家不管,不遍历
        for i in range(2,n):
            dp[i] = max(dp[i-1],dp[i-2]+nums[i-1])
        # 取到最后一家的前一家
        ans1 = dp[n-1]
        # 不取第一家
        dp = [0]*(n+1)
        # 遍历到最后一家
        for i in range(2,n+1):
            dp[i] = max(dp[i-1],dp[i-2]+nums[i-1])
        # 取到最后一家
        ans2 = dp[n]
        return max(ans1,ans2)

相关推荐

  1. 【打卡】牛客网:BM79 打家劫舍()

    2024-06-09 04:06:01       42 阅读
  2. 动态规划打家劫舍 II

    2024-06-09 04:06:01       9 阅读
  3. DAY52:动态规划打家劫舍系列)

    2024-06-09 04:06:01       33 阅读
  4. 动态规划专练( 231.打家劫舍Ⅱ)

    2024-06-09 04:06:01       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 04:06:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 04:06:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 04:06:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 04:06:01       20 阅读

热门阅读

  1. vite+vue+ts项目中报错解决方案

    2024-06-09 04:06:01       9 阅读
  2. 前端学习笔记

    2024-06-09 04:06:01       8 阅读
  3. Python | 刷题笔记

    2024-06-09 04:06:01       10 阅读
  4. C++ extern “C”

    2024-06-09 04:06:01       9 阅读
  5. 1130. 【二维数组】打印螺旋矩阵

    2024-06-09 04:06:01       8 阅读
  6. Android 13 亮度调节代码分析

    2024-06-09 04:06:01       11 阅读
  7. 中国剩余定理学习

    2024-06-09 04:06:01       10 阅读