House Robber(房屋偷盗问题):动态规划解法

本文详细解析LeetCode中的198. House Robber和213. House Robber II题目,通过动态规划方法解决房屋偷盗问题,包括定义状态、转移方程、初始值和边界条件、计算顺序、代码实现及复杂度分析,并讨论了空间复杂度的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. LeetCode198. House Robber

序列型动态规划问题,仍然按照一般的分析方法进行分析

1.定义状态

最后一步

  • 先明确最后的问题是在前n栋房子中能够盗取到的最大金额,且相邻的两栋房子不能被同时盗窃
  • 无论小偷在前面的房子的决策如何,它一定会在最后一栋房子第n-1栋房子决定偷还是不偷,那么就存在两种情况
    • 选择不偷第n-1栋房子,那么在前n栋房子中盗取金钱的最大值就等于在前n-1栋房子中盗取金钱的最大值。这个很容易理解嘛,第n-1栋选择不偷,那最后能盗取到的最大的金额肯定和第n-1栋房子无关
    • 选择第n-1栋房子
      • 首先一定会获取偷第n-1栋房子带来的金额:nums[n - 1]
      • 其次既然偷了第n-1栋房子,那么第n-2栋房子肯定不能被偷了,这个时候在前n栋房子中盗取金钱的最大值就等于在前n-2栋房子中盗取金钱的最大值加上nums[n-1]。(这里的分析要注意的区别和对应关系,前n栋房子的最大值和最后一栋房子,也就是第n-1栋房子是否被盗有关,这里从第0栋开始到第n-1栋结束,一共n栋房子嘛,也就是对应前n栋,现在第n-2栋房子不被盗取,那么前n-1栋房子的情况就不能被考虑了,因为前n-1栋房子的最大值是和第n-2栋房子是否被盗取有关)

子问题

  • 原问题:前n栋房子中能够盗取到的最大金额
  • 子问题:前n-1栋房子中盗取金钱的最大值;前n-2栋房子中盗取金钱的最大值

状态

  • f[i]:表示盗窃前i栋房子能获得金钱的最大值

2.转移方程

  • f[i] = Max{f[i-1], f[i-2] + nums[i-1]}

在这里插入图片描述

3.初始值和边界条件

这部分往往根据转移方程来确定,边界条件就是要避免数组越界的位置

  • f[0] = 0:前0栋房子能获取的金额的最大值是0
  • f[1] = nums[0]
  • f的计算从i = 2开始

4.计算顺序

  • f[0]
  • f[1]
  • f[2]
  • f[n]
  • 所以需要开辟一个长度为n+1的数组
  • 最后返回f[n]即可

5.代码

 public static int rob_20191111(int[] nums) {
   
        if (nums == null || nums.length == 0){
   
            return 0;
        }
        int n = nums.length;
        //f[0]->f[1]--->f[n-1]--> f[n]
        //f[i] : 能在前i户人家中偷盗的最大值
        int[] f = new int[n + 1];
        //init
        f[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值