[动态规划] (十二) 简单多状态 LeetCode 213.打家劫舍II

[动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II

文章目录

213. 打家劫舍 II

题目解析

本题是对打家劫舍和按摩师的升级题型,可以看完上一道题再来看下面的内容。

[动态规划\] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍-CSDN博客](https://blog.csdn.net/dev1cce/article/details/134270952?spm=1001.2014.3001.5501) (1) 房屋是环绕的,第一个房子和最后一个房子是紧挨着的 (2) 不能连续进入房子 (3) 返回最高金额 ##### 解题思路 ###### 状态表示 dp\[i\]:按照以往的经验,以i为结尾可以获得的最高的金额。 dp\[i\]又可以分为偷到`i`位置时,进入`i`房间(f\[i\])和不进入`i`房间(g\[i\])。(详情可以点之前的链接。) 但是本题又不一样,多了个房屋环绕,如图。 ![image-20231107165806156](https://file.jishuzhan.net/article/1721844440261201921/3a3545233a2c5d0b5645536498919c80.webp) 由于0号房间和n-1号房间是紧挨的,我们只能进入其中一个。 所以细分问题为:进入0号房或者不进入0号房。 * 进入0号房 如果偷了0号房,那么我们首先就不能再进入1号,和n-1号。 剩下的2~n-2号就是一个打家劫舍I的子问题:从2~n-2号进行打家劫舍I。 * 不进入0号房 如果不进入了0号房,那么我们可以划分1~n-1号房为打家劫舍I的子问题,从1~n-1号房进行打家劫舍I。 ###### 状态转移方程 和打家劫舍I一样。 * f\[i

进入i号房间就不能进入i-1号房间。(与打家劫舍I、按摩师分析相同)

shell 复制代码
f[i] = g[i-1] + nums[i]
  • g[i]

不进入i号房,就要选择进入或者不进入i-1号房。(与打家劫舍I、按摩师分析相同)

shell 复制代码
g[i] = max(f[i-1], g[i-1])
初始化和填表顺序
  • 初始化

(与打家劫舍I、按摩师分析相同)

shell 复制代码
f[0] = nums[0], g[0] = 0;
  • 填表顺序

(与打家劫舍I、按摩师分析相同)

从左向右填表即可。

返回值

(与打家劫舍I、按摩师分析相同)

返回较大的那个金额即可。

提醒

仅仅是对问题进行分类,实际上还是打家劫舍I(按摩师)问题。

看到这里就可以去尝试实现代码了,然后再看下面的内容。


代码实现
shell 复制代码
class Solution {
public:
    int rob1(vector<int>& nums, int left, int right)
    {
        if(left > right) return 0;
        //创建dp数组
        int n = nums.size();
        vector<int> f(n);
        vector<int> g(n);
        //初始化
        f[left] = nums[left];
        //填表
        for(int i = left+1; i <= right; i++)
        {
            f[i] = g[i-1] + nums[i];
            g[i] = max(f[i-1], g[i-1]);
        }
        //返回值
        return max(f[right], g[right]);
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
       return max(nums[0] + rob1(nums, 2, n-2), rob1(nums, 1, n-1));
    }
};
总结

细节1:本质上是进行打家劫舍I(按摩师)问题,只需要划分好区间即可。

细节2:注意,如果left>right时,还进行填表就没有意义了

细节3:初始化时,我们从传进来的位置left初始化即可,填表从传进来的left+1开始。

细节4:返回值是最后一个位置的元素即为max(f[right], g[right])

细节5:大家都不要学习偷窃这种行为。

相关推荐
健康胡3 分钟前
仿射变换 与 透视变换
图像处理·人工智能·深度学习·opencv·算法·机器学习·计算机视觉
L_cl5 分钟前
【Python 算法零基础 2.模拟 ④ 基于矩阵】
python·算法·矩阵
2301_807611498 分钟前
310. 最小高度树
c++·算法·leetcode·深度优先·回溯
@ chen21 分钟前
常见排序算法及其java实现
java·算法·排序算法
学习中的码虫1 小时前
数据结构中的高级排序算法
数据结构·算法·排序算法
山北雨夜漫步1 小时前
机器学习 Day17 朴素贝叶斯算法-----概率论知识
人工智能·算法·机器学习
是店小二呀2 小时前
【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
android·c++·算法
成工小白2 小时前
【Linux】进程地址空间
linux·算法
凤年徐2 小时前
【C/C++】自定义类型:结构体
c语言·开发语言·c++·经验分享·笔记·算法
Inverse1623 小时前
C语言_自定义类型:结构体
c语言·开发语言·算法