[Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解

目录

  • 1.按摩师
    • 1.题目链接
    • 2.算法思路详解
    • 3.代码实现
  • 2.打家劫舍 II
    • 1.题目链接
    • 2.算法思路详解
    • 3.代码实现
  • 3.删除并获得点数
    • 1.题目链接
    • 2.算法思路详解
    • 3.代码实现
  • 4.粉刷房子
    • 1.题目链接
    • 2.算法思路详解
    • 3.代码实现


1.按摩师

1.题目链接

  • 按摩师

2.算法思路详解

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • 选择到i位置的时候,此时的最长预约时长
      • 本题,状态表示还可以继续细分:
        • f[i]:选择到i位置的时候,nums[i]必选,此时的最长预约时长
        • g[i]:选择到i位置的时候,nums[i]不选,此时的最长预约时长
    • 推导状态转移方程

      • f[i] = g[i - 1] + nums[i]
      • g[i] = max(f[i - 1], g[i - 1])
        请添加图片描述
    • 初始化:f[0] = nums[0], g[0] = 0

    • 确定填表顺序:从左往右,两个表一起填

    • 确定返回值:max(f[n - 1], g[n - 1])


3.代码实现

int massage(vector<int>& nums) 
{
    int n = nums.size();
    if(n == 0) return 0;

    vector<int> f(n);
    vector<int> g(n);
    f[0] = nums[0];

    for(int i = 1; i < n; i++)
    {
        f[i] = g[i - 1] + nums[i];
        g[i] = max(f[i - 1], g[i - 1]);
    }

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

2.打家劫舍 II

1.题目链接

  • 打家劫舍 II

2.算法思路详解

  • 思路解析:本题比打家劫舍Ⅰ只多了环形问题,那么只需将环形问题分类讨论(依据nums[0]),拆解为两个线性的打家劫舍Ⅰ问题即可
    • 第一个位置偷nums[0] + _rob[2, n - 2] <— 第二个位置和最后一个位置不偷
    • 第一个位置不偷_rob(1, n - 1) <— 偷第二个位置和最后一个位置
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置的时候,此时的最大金额
      • 本题,状态表示还可以继续细分:
        • f[i]:偷到i位置的时候,nums[i]必偷,此时的最大金额
        • g[i]:偷到i位置的时候,nums[i]不偷,此时的最大金额
    • 推导状态转移方程

      • f[i] = g[i - 1] + nums[i]
      • g[i] = max(f[i - 1], g[i - 1])
        请添加图片描述
    • 初始化:f[0] = nums[0], g[0] = 0

    • 确定填表顺序:从左往右,两个表一起填

    • 确定返回值:max(f[n - 1], g[n - 1])


3.代码实现

class Solution
{
public:
    int rob(vector<int>& nums) 
    {
        int n = nums.size();
        
        // 分类讨论,取两种情况中的最大值
        return max(nums[0] + _rob(nums, 2, n - 2), _rob(nums, 1, n - 1));
    }
    
    int _rob(vector<int>& nums, int left, int right)
    {
        if(left > right) return 0;
        
        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]);
    }
};

3.删除并获得点数

1.题目链接

  • 删除并获得点数

2.算法思路详解

  • 思路解析:本题可以先做一个预处理,将问题转化为打家劫舍

    • 思路
      • 打家劫舍要求访问数组中的数的顺序是连续的,但本题原始数组显然不符合要求
      • 虽然原始数组数值不符合要求,但是经过转换,数组下标是可以符合顺序连续的
    • 做法
      • 将原始数组中的数,统计到arr,然后在arr中,做一次打家劫舍问题即可
      • 此时,数值相同的值的和可以被其本身值作为arr的下标索引到 <— hash[x] = sum(x)
      • arr[i]i这个数出现的总和
        请添加图片描述
  • 思路

    • 确定状态表示 -> dp[i]的含义

      • i位置的时候,此时获得的最大点数
      • 本题,状态表示还可以继续细分:
        • f[i]:选到i位置的时候,nums[i]必选,此时获得的最大点数
        • g[i]:选到i位置的时候,nums[i]不选,此时获得的最大点数
    • 推导状态转移方程

      • f[i] = g[i - 1] + arr[i]
      • g[i] = max(f[i - 1], g[i - 1])
        请添加图片描述
    • 初始化:f[0] = arr[0], g[0] = 0

    • 确定填表顺序:从左往右,两个表一起填

    • 确定返回值:max(f[n], g[n])


3.代码实现

int deleteAndEarn(vector<int>& nums) 
{
    sort(nums.begin(), nums.end());
    int n = nums.back(); // max

    vector<int> arr(n + 1);
    for(auto& x : nums)
    {
        arr[x] += x;
    }

    vector<int> f(n + 1);
    vector<int> g(n + 1);
    for(int i = 1; i <= n; i++)
    {
        f[i] = g[i - 1] + arr[i];
        g[i] = max(f[i - 1], g[i - 1]);
    }

    return max(f[n], g[n]);
}

4.粉刷房子

1.题目链接

  • 粉刷房子

2.算法思路详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义:i -> 到了哪个位置,j -> 这个位置的哪个颜色

      • dp[i][0]:粉刷i位置的时候,最后一个位置刷上红色,此时的最小花费
      • dp[i][1]:粉刷i位置的时候,最后一个位置刷上蓝色,此时的最小花费
      • dp[i][2]:粉刷i位置的时候,最后一个位置刷上绿色,此时的最小花费
        请添加图片描述
    • 推导状态转移方程

      • dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0]
      • dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1]
      • dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2]
        请添加图片描述
    • 初始化:dp[0][0] = dp[0][1] = dp[0][2] = 0

    • 确定填表顺序:从左往右,一次填写三个表

    • 确定返回值:min(dp[n][0], min(dp[n][1], dp[n][2]))


3.代码实现

int minCost(vector<vector<int>>& costs) 
{
    int n = costs.size();
    vector<vector<int>> dp(n + 1, vector<int>(3));

    for(int i = 1; i <= n; i++)
    {
        dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];
        dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];
        dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];
    }

    return min(dp[n][0], min(dp[n][1], dp[n][2]));
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 ISCC pwn wp

iscc 练武pwn 总结第一周chaosISCC_easyFlagshopping 第二周ISCC_easyISCC_Uheapheap 第三周miaoYour_programeazy_heap 总结 总体感觉iscc考察的题目都挺基础的&#xff0c;在目前这种比赛的大环境下&#xff0c;仍然出这种&#xff0c;比较基础的题目&#xff0c;实在是难得…

原生js实现拖拽改变元素顺序

代码展示如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

NLP(19)--大模型发展(3)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 大模型训练相关知识&#xff1a; 问题&#xff1a; 数据集过大&#xff0c;快速训练模型过大&#xff0c;gpu跑不完 方案&#xff1a; 数据并行训练&#xff1a; 复制数据&#xff08;batch_size&#xff09;到多个gpu&…

毕设 大数据校园卡数据分析

文章目录 0 前言1 课题介绍2 数据预处理2.1 数据清洗2.2 数据规约 3 模型建立和分析3.1 不同专业、性别的学生与消费能力的关系3.2 消费时间的特征分析 4 Web系统效果展示5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设…

人工智能场景下的网络负载均衡技术

AI技术驱动智能应用井喷&#xff0c;智能算力增速远超通用算力。IDC预测&#xff0c;未来五年&#xff0c;我国智能算力规模年复合增长率将超50%&#xff0c;开启数据中心算力新纪元。随着需求激增&#xff0c;数据中心或智算网络亟需扩容、增速、减时延&#xff0c;确保网络稳…

SM2258G专用SSD开卡工具(三星闪存),后附工具下载

工具下载&#xff1a; https://download.csdn.net/download/weixin_43097956/89354302

【C++】深入解析C++智能指针:从auto_ptr到unique_ptr与shared_ptr

文章目录 前言&#xff1a;1. 智能指针的使用及原理2. C 98 标准库中的 auto_ptr:3. C 11 中的智能指针循环引用&#xff1a;shared_ptr 定制删除器 4. 内存泄漏总结&#xff1a; 前言&#xff1a; 随着C语言的发展&#xff0c;智能指针作为现代C编程中管理动态分配内存的一种…

VMare下载安装

一.下载 1.百度搜索BROADCOM官网 打开官网&#xff1a; https://www.broadcom.com/​ 2.点击右上角&#xff0c;进行账号注册&#xff0c;注册好后&#xff0c;进行登陆 3.注册好后&#xff0c;进入个人界面&#xff1a;https://support.broadcom.com/#. 按下图所示点击进…

【多线程开发 2】从代码到实战TransmittableThreadLocal

【多线程开发 2】从代码到实战TransmittableThreadLocal 本文将从以下几个点讲解TransmittableThreadLocal(为了方便写以下简称ttl)&#xff1a; 前身 是什么&#xff1f; 可以用来做什么&#xff1f; 源码原理 实战 前身 ThreadLocal 要了解ttl就要先了解Java自带的类…

嵌入式全栈开发学习笔记---C语言笔试复习大全24

目录 内存管理 内存分配 堆和栈的区别&#xff1f;&#xff08;面试重点&#xff09; 申请内存的函数 malloc realloc free gcc工具链 编译的过程&#xff08;面试重点&#xff09; 第一步&#xff0c;预处理&#xff1a; 第二步&#xff0c;编译&#xff1a; 第三…

MySQL-数据库基础

一.MySQL安装 1.1卸载MySQL 把用户切换为root 查看是否有mysql数据库 ps axj | grep mysql 我这个是已经安装好的&#xff0c;为了更清楚的演示我把mysql关闭和mysql安装包卸载 关闭指令 systemctl stop mysqld查看是否在运行指令 systemctl stop mysqld查看安装包指令 …

校园招新之获取进QQ群但未报名人员

校园的社团、实验室招新一般由是校领导会发一个QQ通知&#xff0c;让各个班的同学们进一个招新群。 群里面会有负责人提示大家报名&#xff0c;但是群成员不总是都会报名&#xff0c;我们需要的就是&#xff0c;找到那些&#xff0c;已经进群&#xff0c;但是没有报名的同学&am…

网络原理 一

一、协议 网络通信中,协议是非常重要的概念. 协议进行了分层,此处就是按照这几层顺序来介绍每一层中的核心协议. 应用层,就对应着应用程序,是程序员打交道最多的一层,调用系统提供的 网络api 写出的代码都是基于应用层的. 应用层这里当然也有很多现成的协议,但更多的还是,程…

mysql实战——XtraBackup二进制包安装

1、二进制包下载网站 Software Downloads - Percona 2、安装xtrabackup 解压安装包 tar xvf percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17.tar.gz -C /usr/local 进入目录 cd percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17/ 安装依赖 yum install perl-Dig…

游戏子弹类python设计与实现详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、子弹类设计思路 1. 属性定义 2. 方法设计 三、子弹类实现详解 1. 定义子弹…

SimLab Composer v11.0.46 解锁版安装教程 (3D设计和逼真场景的多功能软件)

前言 SimLab Composer是由Simulation Lab公司推出的一款用于3D设计和逼真场景的多功能软件。该程序具有集成的图形环境&#xff0c;用于真实设计物理场景和对象&#xff0c;用户可以使用该软件中的工具设计简单到复杂和复杂。该程序的一个重要功能是能够构建和共享三维pdf文件…

揭秘章子怡成功之路:她是如何征服世界的?

章子怡的演艺生涯可谓是一部传奇❗❗❗ 从一个普通工人家庭的女孩&#xff0c;到如今的国际巨星 她的每一步都充满了努力和汗水 她的舞蹈基础为她日后的演艺事业奠定了坚实的基础 而她对戏剧和电影的热爱更是让她在演艺道路上不断前行 从《我的父亲母亲》到《卧虎藏龙》&…

【CTF Web】CTFShow web5 Writeup(SQL注入+PHP+位运算)

web5 1 阿呆被老板狂骂一通&#xff0c;决定改掉自己大意的毛病&#xff0c;痛下杀手&#xff0c;修补漏洞。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\…

Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

window好用的网速工具

这是一个用于显示当前网速、CPU及内存利用率的桌面悬浮窗软件&#xff0c;并支持任务栏显示&#xff0c;支持更换皮肤。 github链接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file