算法---动态规划练习-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);
    }
};
相关推荐
mifengxing16 分钟前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
郝学胜-神的一滴35 分钟前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi20261 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog1 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt3 小时前
自制交叉线路识别算法
算法
手写码匠3 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区4 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人5 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin035 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC5 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode