算法---动态规划练习-8(打家劫舍2)

打家劫舍2

  • [1. 题目解析](#1. 题目解析)
  • [2. 讲解算法原理](#2. 讲解算法原理)
  • [3. 编写代码](#3. 编写代码)

1. 题目解析

题目地址点这里

2. 讲解算法原理


  1. 首先,给定一个非负整数数组 nums,其中 numsi 表示第 i 家的财物价值。

  2. 定义两个辅助数组 f 和 g,长度都为 n(n 是数组 nums 的长度)。

    • 数组 f 表示在偷盗范围为 left, right 内,且必须偷最后一家的情况下能够获取的最大财物价值。
    • 数组 g 表示在偷盗范围为 left, right 内,且不偷最后一家的情况下能够获取的最大财物价值。
  3. 定义函数 rob_s,参数为 left、right 和 nums,表示在偷盗范围为 left, right 内计算可以获取的最大财物价值。

  • 初始化数组 f 和 g 的第一个元素
    • fleft = numsleft,表示在偷盗范围 left, right 内偷盗第一家,最大财物价值为第一家的价值
    • gleft = 0,表示在偷盗范围 left, right 内不偷盗第一家,最大财物价值为0
  • 从 left+1 开始,从左到右遍历数组 nums,计算在偷盗范围 left, right 内的最大财物价值:
    • 对于第 i 家,如果选择偷盗,则最大财物价值为前一家不偷盗的最大财物价值 gi-1 加上第 i 家的财物价值 numsi,即 fi = gi-1 + numsi
    • 对于第 i 家,如果选择不偷盗,则最大财物价值为前一家偷盗和不偷盗的最大财物价值中的较大值,即 gi = max(gi-1, fi-1)。
  • 返回在偷盗范围 left, right 内的最大财物价值,即 max(fright, gright)。
  1. 在 rob 函数中,首先判断特殊情况
  • 如果数组 nums 的长度为1,则直接返回第一家的财物价值。
  • 如果数组 nums 的长度为2,则返回两家财物价值中的较大值。
  1. 对于一般情况,分两种情况计算最大财物价值:
  • 情况一:偷盗第一家,但不能偷盗最后一家。对范围 2, n-2 进行一次打家劫舍(使用函数 rob_s),再加上第一家的财物价值 nums0,即 ret1 = rob_s(2, n-2, nums) + nums0
  • 情况二:不偷盗第一家,对范围 1, n-1 进行一次打家劫舍(使用函数 rob_s),即 ret2 = rob_s(1, n-1, nums)
  1. 返回两种情况下的最大财物价值,即 max(ret1, ret2)

3. 编写代码

cpp 复制代码
class Solution {
public:
    int rob_s(int left,int right,vector<int>& nums)
    {
        int n=nums.size();
        vector<int> f(n);
        vector<int> g(n);
        f[left]=nums[left],g[left]=0;
        for(int i=left+1;i<=right;i++)
        {
            f[i]=g[i-1]+nums[i];
            g[i]=max(g[i-1],f[i-1]);
        }
        return max(f[right],g[right]);
    }

    int rob(vector<int>& nums) {
        int n=nums.size();
        //处理特殊情况
        if(n==1) return nums[0];
        else if(n==2) return max(nums[0],nums[1]);
        vector<int> f(n);
        vector<int> g(n);
        //情况一:偷第一家,就不能偷最后一家->对[2,n-2]进行一次打家劫舍1再+nums[0]就行
        int ret1=rob_s(2,n-2,nums)+nums[0];
        //情况二:不偷第一家,对[1,n-1]进行一次打家劫舍1就行
        int ret2=rob_s(1,n-1,nums);
        return max(ret1,ret2);
    }
};
相关推荐
编程圈子6 分钟前
电机驱动开发学习19. 霍尔 BLDC 三段式 FOC 启动算法
驱动开发·学习·算法
Hello_Damon_Nikola11 分钟前
伺服电机堵转检测算法详解
单片机·嵌入式硬件·算法
罗小罗同学1 小时前
安德森癌症中心发表SCOPE IO模型,实现了对罕见肿瘤帕博利珠单抗疗效的精准预测,在患者早期即可预判药效
人工智能·算法·医学图像处理·医学ai
王维同学1 小时前
IFEO Debugger、VerifierDlls 与 SilentProcessExit 配置
c++·windows·安全·注册表
变量未定义~1 小时前
Tarjan算法-强连通分量、路径、出差
算法
geovindu1 小时前
CSharp: Iterative Algorithms
开发语言·后端·算法·c#·.net·迭代算法
小保CPP1 小时前
OpenCV C++计算多边形的最大内切圆
c++·人工智能·opencv·计算机视觉
雨落在了我的手上1 小时前
Java数据结构(六):链表的介绍
java·开发语言·数据结构
道影子2 小时前
《黄帝内经》021章|津凝精晶 沉降为患
人工智能·深度学习·神经网络·算法·机器学习
道影子2 小时前
《黄帝内经》022章|调和双旋 伏风自消
人工智能·深度学习·神经网络·算法·机器学习