动规算法题:打家劫舍Ⅱ

news2025/1/12 8:44:36

题目链接:打家劫舍Ⅱ

题目分析

状态表示

从题目分析中可以得知,是有偷和不偷的情况,因此根据做题经验,就使用两个数组来对应着两个情况。

状态转移方程

①当选择偷第i个位置,那就意味着第i-1个位置的值是不能偷的(从左往右算)。而不去选择第i-1个位置,那就是g[i-1],因此,f[i]的状态转移方程是:

f[i] = g[i-1]+nums[0];

②当选择不偷第i个位置,那就意味着第i-1个位置是可以偷,但是也可以不偷,因此需要选择这两者其中的最大值,因此,g[i]的状态转移方程是:

g[i] = max(g[i-1],f[i-1]);//在偷和不偷两种中选择最大值

初始化

从状态转移方程中可以知道,我们需要从i =1出发,为了不越界,需要将i==0这个位置初始化。因为f[i]是偷的,那么将f[0] = nums[0],g[i]不偷,则g[0] = 0;

方向是从左到右开始计算结果。

返回值

在到达最后的位置,有两种选择,一是不偷,二是偷,因此最终结果是在这两种情况下,选择最大值的:

return max(f[n-1],g[n-1]);

编写代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();/*获取数组的长度*/
        return max(nums[0]+robl(nums,2,n-2),robl(nums,1,n-1));/*在偷和不偷中选择最大值*/
    }
    int robl(vector<int>& nums,int left,int right)
    {
        if(left > right) return 0;
        /*创建出dp数组:g和f*/
        int n = nums.size();
        vector<int> f(n);
        auto g =f;
        /*初始化*/
        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(g[right],f[right]);
    }
};

总结

先分析题目,挖掘题目中的条件,使用条件来定义出状态表示。接着,根据经验得出,有两个情况,先试试看看用两个数组用来保存两个不同条件的值,然后选出最大值是否行得通,行得通就可以了!并且,后面的结果是需要用前面的结果来算出来的,因此是从左到右遍历。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis(opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#…

大项与小项

小项 n个命题变元的简单合取式&#xff0c;称作小项&#xff0c;其中每个命题变元与它的否定不能同时存在&#xff0c;但每个命题变元必须出现且仅出现一次。 n个命题变元的小项有2^n个 小项的编码&#xff1a;mi&#xff0c;其中i是使得小项等于1的一组指派的二进制表示。 大项…

英飞凌 Tc3xx AURIX 2G多核处理器简介

目录 1、概述 2、AURIX 2G多核架构 2.1、多核简介 2.2、片上总线简介 3、AURIX 2G内核简介 3.1、内核架构 3.2、内核寄存器 3.3、中断处理 4、AURIX 2G内存简介 4.1、内存简介 4.2、内存映射 1、概述 该产品具备多达六核的高性能架构,每个内核的时钟频率最高可达 30…

基于java+swing俄罗斯方块

基于javaswing俄罗斯方块 一、系统介绍二、功能展示三、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java SE项目&#xff08;awtswing&#xff09;非开源 项目名称&#xff1a;俄罗斯方块&#xff08;Tertis) 主要技术&#xff1a;java、awt、swing等技术 …

CSDN首页消息发布文章topSpInfo

Java 这东西就是纯粹的概念&#xff0c;而且很多公司还喜欢拿着这个不停的问。 我们平常写的 Class 就是对象。 New 就是把这个 Class 实例化&#xff0c;实例化啥意思&#xff0c;就是在内存中分配空间呗&#xff0c;不实例化&#xff0c;数据存哪里呀。 这里就是有个奇葩的…

错题整理——测开2021网易

1. 某些bug不影响使用时&#xff0c;可以选择先上线&#xff0c;在维护过程中修复。 2. df&#xff1a;查看磁盘使用情况 dir不是linux的常用的命令&#xff0c;不过用dir能够罗列出目录内容&#xff1b;dir默认没有颜色的区别&#xff0c;但也可以设置。现在都使用ls来代替。…

详细手机代理IP配置

嗨&#xff0c;亲爱的朋友们&#xff01;作为一家代理产品供应商&#xff0c;我知道有很多小伙伴在使用手机进行网络爬虫和数据采集时&#xff0c;常常会遇到一些IP限制的问题。别担心&#xff01;今天我要给大家分享一下手机IP代理的设置方法&#xff0c;让你们轻松应对这些限…

【C++STL基础入门】string迭代器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、迭代器是什么&#xff1f;二、string迭代器1.定义迭代器理解 2.通过迭代器遍历遍历方式1遍历方式2 3.迭代器失效4.涉及到的迭代函数1、begin()2、end()3、a…

element 图标变颜色和更改大小

需求效果&#xff1a; element自带颜色不符合&#xff0c;且大小不一致。 // 穿透更改图标大小 /deep/ i.el-icon-info{font-size: 20px;} 颜色变化&#xff1a;

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构&#xff0c;那么对于同一种服务&#xff0c;当然不可能只有一个节点&#xff0c;需要部署多个节点 架构图如下&#xff1a; 由上可以看出存在多个同一种服务提供者&#xff08;Service Provider&#xff09; 搭建服务提供者集…

基于Python的图书馆大数据可视化分析系统设计与实现

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java、Python等技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; …

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复&#xff1f;数据丢失是一种让人非常头疼的问题&#xff0c;尤其是当我们的U盘数据丢失了&#xff0c;但内存仍然被占用时&#xff0c;更令人困惑和焦虑。然而&#xff0c;不要慌张&#xff01;在本文中&#xff0c;将为大家介绍一些有效的方法来恢…

STM32F4X 定时器PWM

STM32F4X 定时器PWM 什么是PWMSTM32F4X PWM使用GPIO引脚复用STM32F4X PWM配置参数定时器PWM输出通道定时器PWM输出模式定时器PWM有效电平定时器PWM工作过程定时器PWM频率计算 STM32F4X PWM配置步骤STM32F4X PWM配置函数 上节说到了定时器的定时功能&#xff0c;这节说一下定时器…

10种最流行的3D模型文件格式及转换方法

3D 文件格式用于存储有关 3D 模型的信息。 你可能听说过一些最流行的格式&#xff0c;包括 STL、OBJ、FBX 和 DAE。 它们广泛应用于从视频游戏动画到工业增材制造的各种应用中。 在本文中&#xff0c;我们将考虑为什么有这么多不同的格式&#xff0c;探讨 3D 文件格式存储的四…

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘c

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘cudart64_110.dll’; dlerror: cudart64_110.dll not found I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not ha…

C++ 二叉搜索树的概念特性

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树 &#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大…

华为云部署JDK环境

一、确定系统内核 在下载jdk之前要先确定自己的内核是什么版本&#xff0c;因为我选的云服务器是CentOS7&#xff0c;所以一定是Linux_86_64版本。 若不确定可以在命令行中输入“uname -a”来查看系统内核。 二、下载JDK 到官网下载对应统信系统版本的jdk安装包 jdk官网&…

Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 线程池及常用的线程池

目录 引出创建多线程的方法Thread类创建多线程Runnable接口创建多线程Thread类的常用方法两者的对比 线程池是啥&#xff1f;为啥用&#xff1f;结合案例理解常用的线程池继承Runnable接口的工人实体类newSingleThreadExecutor&#xff08;单线程&#xff09;newFixedThreadPoo…

Simulink仿真模块 - Clock

Clock&#xff1a;显示并提供仿真时间 库&#xff1a; Simulink / Sources 模型为&#xff1a; 说明 Clock 模块在每个仿真时间步输出当前仿真时间。此模块对需要仿真时间的其他模块非常有用。 当在离散系统中需要当前时间时&#xff0c;请使用Digital Clock模块。 实例 模块…

利用python批量掩膜提取遥感图像

&#xff08;1&#xff09; 前言 遥感影像的提取和分析在地理信息系统、环境监测、农业、城市规划等领域具有重要的应用价值。按掩膜提取遥感影像是一种常用的方法&#xff0c;它可以通过定义掩膜来选择感兴趣的区域&#xff0c;并排除其他干扰因素。 按掩膜提取遥感影像的方…