[动态规划] (十二) 简单多状态 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:大家都不要学习偷窃这种行为。

相关推荐
梭七y17 分钟前
【力扣hot100题】(103)移动零
数据结构·算法·leetcode
weixin_4130632136 分钟前
测试《A Simple Algorithm for Fitting a Gaussian Function》拟合
python·算法
MarkHD1 小时前
智能体在车联网中的应用:第31天 基于RLlib的多智能体PPO实战:MAPPO算法解决simple_spread合作任务
算法
IT猿手1 小时前
三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码
算法·matlab·动态规划·无人机·路径规划·动态路径规划
wadesir1 小时前
Java实现遗传算法(从零开始掌握智能优化算法)
java·开发语言·算法
Jeremy爱编码1 小时前
leetcode热题腐烂的橘子
算法·leetcode·职场和发展
H CHY1 小时前
C++代码
c语言·开发语言·数据结构·c++·算法·青少年编程
alphaTao1 小时前
LeetCode 每日一题 2025/12/22-2025/12/28
算法·leetcode
xiaolang_8616_wjl1 小时前
c++题目_传桶(改编于atcoder(题目:Heavy Buckets))
数据结构·c++·算法
中國龍在廣州2 小时前
生成不遗忘,「超长时序」世界模型,北大EgoLCD长短时记忆加持
人工智能·深度学习·算法·自然语言处理·chatgpt