动态规划 —— dp 问题-打家劫舍II

news2024/11/6 15:05:56

1.打家劫舍II

题目链接:

213. 打家劫舍 II - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/house-robber-ii/

 


2. 题目解析 

通过分类讨论,将环形问题转换为两个线性的“打家劫舍|”

   

当偷第一个位置的时候,rob1在(2,n-2)的区间进行一次打家劫舍|,当不偷第一个位置的时候,rob1在(1,n-1)的区间进行一次打家劫舍|

 


3.  算法原理 

状态表示:以某一个位置为结尾或者以某一个位置为起点

   

dp[i]表示:偷到i位置的时候,此时的最大金额分两种情况:

    

        1.f[i]表示:偷到i位置的时候,当前位置nums[i]必偷,此时的最大金额

    

        2.g[i]表示:偷到i位置的时候,当前位置nums[i]不偷,此时的最大金额

    

2. 状态转移方程

  

根据最近的一步来划分问题:

   

到达dp[i][j]有两种情况:

    

  1. f[i]=g[i-1] + nums[i]

   

2. g[i]:a. 当选择i-1的位置时:f[i-1]

    

              b.当不选择i-1的位置时:g[i-1]

    

              g[i]=max(f[i-1],g[i-1])

3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行

    

本题初始化为:f[0]=nums[0]    g[0]=0

4. 填表顺序 

    

本题的填表顺序是:从左往右,两个表一起填

5. 返回值 :题目要求 + 状态表示 

    

偷到最后一个位置分为两种情况:偷和不偷   

本题的返回值是:max(f[n-1],g[n-1])


 4.代码

动态规划的固定四步骤:1.  创建一个dp表

                                        2. 在填表之前初始化

                                        3. 填表(填表方法:状态转移方程)

                                        4. 确定返回值 

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));
    }

    int rob1(vector<int>& nums,int left,int right)//左边界和右边界
        {
            //处理一下边界情况
            if(left>right) return 0;//如果l>r,那么说明区间不存在

            int n=nums.size();
            vector<int>f(n);//开辟两个dp表
            auto g=f;

            //将l到r这段区间的值初始化
            f[left]=nums[left];
            //从l+1的位置开始填表
            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]);
        }
};


完结撒花~ 

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

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

相关文章

配置elk插件安全访问elk前台页面

编辑els配置文件vim elasticsearch.yml,添加以下配置文件 用elk用户&#xff0c;启动els服务 关闭防火墙&#xff0c;查看els启动是否成功&#xff0c;通过是否启动java进程来判断 或者通过查看是否启动9200和9300端口来判断是否启动 交互模式启动密码配置文件interactive表示交…

通过mybatis和mybatis plus 实现用户注册功能和基础的增删改查

1,切分application的环境并引入依赖 通过将application.yml进行切分&#xff0c;切分成三个不同的环境&#xff0c;生产环境和开发环境&#xff0c;我们可以在不同情况下所需要的不同环境上进行相关的配置 我们对代码进行一次切分 application.yml spring:application:name…

TypeError: Cannot read properties of undefined (reading ‘__asyncLoader‘)

项目场景&#xff1a; vue3element-plus 项目场景&#xff1a;vue3element-plustsvite的技术栈开发的后台&#xff0c;一个后台列表页面&#xff0c;使用了ElTable组件 问题描述 页面提示报一个好像是异步的问题 runtime-core.esm-bundler.js:2261 Uncaught (in promise) Ty…

大模型学习笔记------CLIP模型解读与思考

大模型学习笔记------CLIP模型解读与思考 1、为什么提出CLIP模型2、CLIP模型详解3、CLIP模型的重要意义 上文已经讲到&#xff0c;我认为多模态的大模型是最有前途的大模型&#xff0c;首先学习的就是CLIP这个模型。 CLIP&#xff08;Contrastive Language-Image Pretraining&…

【大数据学习 | kafka】kafka的ack和一致性

1. ack级别 上文中我们提到过kafka是存在确认应答机制的&#xff0c;也就是数据在发送到kafka的时候&#xff0c;kafka会回复一个确认信息&#xff0c;这个确认信息是存在等级的。 ack0 这个等级是最低的&#xff0c;这个级别中数据sender线程复制完毕数据默认kafka已经接收到…

完美解决mysql -u root -p ‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

如果你已经安装了mysql8.0&#xff0c;但是还出现是下面的问题&#xff0c;解决方法是从根目录打开或者配置环境变量。 遇到的错误主要是与命令行环境和 MySQL 命令无法识别有关。这里我会逐步分析问题&#xff0c;并给出可能的解决方法。 问题描述和分析&#xff1a; ‘my…

UE5 材质篇 1 如何偏移顶点

顶点偏移 start content里的plane长这样 我们进行一点顶点偏移就能长这样 XY加起来乘个缩放系数扔给sin结果乘个缩放系数即可

求助帖【如何学习核磁共振的原理】

最近提前进组了 我完全不懂磁共振的相关知识 想问问各位大佬有没有推荐的学习路线 或者是学习资料、论坛都可以的&#xff08;我做的方向是磁共振成像技术&#xff09; 老师给了一本书&#xff0c;但是有点看不懂&#xff0c;全英文的 叫Principles Of Magnetic Resonance …

vite+vue项目创建流程;npm error enoent Could not read package.json异常报错问题

前提概要&#xff1a;默认下载好node vue vite等等东西啊 新建文件夹&#xff0c;放项目管理员身份运行命令行&#xff0c;先转到所在大盘&#xff0c;然后再cd到具体的新建文件夹&#xff0c;执行npm init vitelatest命令。 管理员身份运行vscode&#xff0c;打开刚才新建的v…

[mysql]修改表和课后练习

目录 DDL数据定义语言 添加一个字段 添加一个字段到最后一个 添加到表中的第一个一个字段 选择其中一个位置: 修改一个字段:数据类型,长度,默认值(略) 重命名一个字段 删除一个字段 重命名表 删除表 清空表 DCL中事务相关内容 DCL中COMMIT和ROLLBACK的讲解 对比TR…

秒杀系统的设计与压测

环境准备 数据库 完成demo至少需要两个数据表&#xff0c;一个customer表示秒杀的用户&#xff0c;一个sec_product表示被秒杀的商品。 create database sec_kill;use sec_kill; create table customer(id int primary key auto_increment not null,name varchar(20),phone …

SpringBoot健身房管理系统:用户体验至上

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

一:时序数据库-Influx应用

目录 0、版本号 1、登录页面 2、账号基本信息 3、数据库案例 4、可视化 5、java案例 0、版本号 InfluxDB v2.4.0 1、登录页面 http://127.0.0.1:8086/signin 账号&#xff1a;自己账号 密码&#xff1a;自己密码 2、账号基本信息 查看用户id和组织id&#xff01;&…

SpringBoot day 1105

ok了家人们&#xff0c;今天继续学习spring boot&#xff0c;let‘s go 六.SpringBoot实现SSM整合 6.1 创建工程&#xff0c;导入静态资源 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</…

深入实践:Langchain-Chatchat大型语言模型本地知识库的部署难题、解决方案及应用指南

检索增强生成(RAG)实践&#xff1a;基于LlamaIndex和Qwen1.5搭建智能问答系统 什么是 RAG LLM 会产生误导性的 “幻觉”&#xff0c;依赖的信息可能过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是…

鸿蒙5.0时代:原生鸿蒙应用市场引领开发者服务新篇章

前言 10月22日原生鸿蒙之夜发布会宣布HarmonyOS NEXT正式发布&#xff0c;首个版本号&#xff1a;鸿蒙5.0。这次“纯血鸿蒙”脱离了底层安卓架构成为纯国产的独立系统&#xff0c;仅凭这一点就有很多想象空间。 目前鸿蒙生态设备已超10亿&#xff0c;原生鸿蒙操作系统在中国市…

Spark的容错机制

1&#xff0c;Spark如何保障数据的安全 1、RDD容错机制&#xff1a;persist持久化机制 1&#xff09;cache算子 - 功能&#xff1a;将RDD缓存在内存中 - 语法&#xff1a;cache() - 本质&#xff1a;底层调用的还是persist&#xff08;StorageLevel.MEMORY_ONLY&#xff09;&…

Web3对社交媒体的影响:重新定义用户互动方式

随着互联网的发展和人们对隐私、安全、所有权的需求不断提高&#xff0c;Web3 的概念逐渐深入人心。Web3 的出现标志着一个去中心化、用户主导的网络时代的到来&#xff0c;这也将对社交媒体产生深远的影响。Web3 不仅推动社交媒体从中心化模式向用户主导的去中心化模式转变&am…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求&#xff1a; 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装&#xff1a; 1.设置软件源&#xff1a; 官方提供的软件源&#xff1a; sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

解决Knife4j 接口界面UI中文乱码问题

1、查看乱码情况 2、修改 编码设置 3、删除 target 文件 项目重新启动 被坑死了