[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(); // maxvector<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]));
}

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

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

相关文章

大模型提示词Prompt学习

引言 关于chatGPT的Prompt Engineer&#xff0c;大家肯定耳朵都听起茧了。但是它的来由&#xff1f;&#xff0c;怎么能用好&#xff1f;很多人可能并不觉得并不是一个问题&#xff0c;或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚&#xff08;因为觉得没必要深…

Redis第18讲——Redis和Redission实现延迟消息

即使不是做电商业务的同学&#xff0c;也一定知道订单超时关闭这种业务场景&#xff0c;这个场景大致就是用户下单后&#xff0c;如果在一定时间内未支付&#xff08;比如15分钟、半小时&#xff09;&#xff0c;那么系统就会把这笔订单给关闭掉。这个功能实现的方式有很多种&a…

unity开发Hololens 制作滑动框

一定要做到最后一步&#xff0c;才会有效果 1、创建空物体 ,并添加组件 创建空物体 命名ScrollingObjectCollection&#xff0c; 添加组件如下图 下面是各个组件展开的内容 2、在ScrollingObjectCollection 下面创建两个空物体&#xff0c;分别命名Container、Clipping…

运筹说 第115期 | 排队论经典例题讲解

通过前几期的学习&#xff0c;我们已经学会了排队论的基本概念、生灭过程和Poisson过程&#xff0c;等待制排队模型、混合制排队模型、其他排队模型以及排队系统优的定义与相关求解方法。在实际工作中&#xff0c;我们能发现排队论在经济管理中有着许多应用&#xff0c;本期小编…

大数据量上传FTP

背景 笔者有一个需求是把将近一亿条数据上传到FTP服务器中&#xff0c;这些数据目前是存储在mysql中&#xff0c;是通过关联几张表查询出来的&#xff0c;查询出来的数据结果集一共是6个字段。要求传输的时候拆分成一个个小文件&#xff0c;每个文件大小不能超过500M。我的测试…

FuTalk设计周刊-Vol.052

#AI漫谈 热点捕手 1.ChatGPT 大更新&#xff01;GPT-4 开始又变聪明了 OpenAI 官方宣布&#xff0c;新版 GPT-4 Turbo 今天开始向所有付费 ChatGPT 用户开放。 链接https://www.pconline.com.cn/focus/1733/17330089.html 2.刷爆多模态任务榜单&#xff01;贾佳亚团队Mini-G…

21.2zabbix低级自动发现-mysql多实例

配置mysql多实例 注释&#xff1a;自动发现&#xff1a;创建监控主机&#xff1b;低级自动发现&#xff1a;创建监控项 mysql单实例是直接yum安装&#xff0c;开启mysql多实例 准备配置文件 #mysql3307实例 cp /etc/my.cnf /etc/my3307.cnf vim /etc/my3307.cnf [mysqld] dat…

产品经理-流程图结构图(四)

1. 流程图 1.1 概念 为了达到特定的目标而进行的一系列有逻辑性的操作步骤&#xff0c;由两个及以上的步骤&#xff0c;完成一个完整的行为的过程&#xff0c;可称之为流程 1.2 产品经理为什么需要绘制流程图&#xff1f; 保证产品的使用逻辑合理顺畅向项目组其他成员清晰的…

代码随想录算法训练营Day4|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、 142.环形链表II、面试题 02.07. 链表相交

24. 两两交换链表中的节点 这道题的关键在于: 1、在置换两个节点的时候&#xff0c;当前节点需要在这俩节点之前一个节点。并且要提前保存cur.next以及cur.next.next。 2、每次置换完一组节点&#xff0c;cur cur.next.next 3、判断结束的标志&#xff1a;奇数个节点&#xf…

如何禁止U盘拷贝文件|禁止U盘使用的软件有哪些

禁止U盘拷贝文件的方法有很多&#xff0c;比如使用注册表、组策略编辑器等&#xff0c;但这些方法都适合个人&#xff0c;不适合企业&#xff0c;因为企业需要对下属多台电脑进行远程管控&#xff0c;需要方便、省时、省力的方法。目前来说&#xff0c;最好的方法就是使用第三方…

技术速递|无障碍应用程序之旅:键盘可访问性和 .NET MAUI

作者&#xff1a;Rachel Kang 排版&#xff1a;Alan Wang 首先让我们一起来看看您的应用程序是否支持键盘访问&#xff1a; 启动您的其中一个应用。如果您的设备尚未连接物理键盘&#xff0c;请连接物理键盘。像平常一样导航您的应用程序&#xff0c;并且仅使用键盘来执行此操…

如何使用Rust构建Python原生库?注意,不是动态链接库!!!

参考文档&#xff1a;https://github.com/PyO3/pyo3 创建python虚拟环境&#xff1a; conda create --name pyo3 python3.11.7激活虚拟环境&#xff1a; conda activate pyo3安装依赖&#xff1a; pip install maturin初始化项目&#xff1a; maturin init构建项目&#x…

小程序checkbox改成圆形与radio样式保持一致

修改前 修改后 html: <view class"agreement"><checkbox value"{{ isAgreed }}" bind:tap"toggleCheckbox" /><text>我同意室外智能健身房 <text class"link" bind:tap"showUserProtocol">用户协…

【JTS Topology Suite】Java对二维几何进行平移、缩放、旋转等坐标变换

JTS介绍 Github项目地址&#xff1a;https://github.com/locationtech/jts Maven库地址&#xff1a;https://mvnrepository.com/artifact/org.locationtech.jts JTS Topology Suite是一个用于创建和操作二维矢量几何的Java库。 JTS有对应的.NET版本NetTopologySuite库&…

2024目前网上最火短剧机器人做法,自动搜索发剧 自动更新资源 自动分享资源

目前整个项目圈子很多的短剧机器人&#xff0c;我写的&#xff0c;自动搜索发剧&#xff0c;自动更新资源&#xff0c;自动分享资源&#xff0c;前段时间大部分做短剧的都是做的短剧分成&#xff0c;我的一个学员做的30W播放量才200块收益&#xff0c;备受启发&#xff0c;我就…

springboot社区助老志愿服务系统-计算机毕业设计源码96682

摘要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在图书馆管理的要求下&#xff0c;开发一款整体式结构的社区助老志愿服务…

社交媒体数据恢复:绿洲

本教程将向您展示如何在绿洲平台上备份和恢复数据&#xff0c;但不涉及推荐任何具体的数据恢复软件。 一、绿洲平台数据备份 为了确保数据的安全&#xff0c;在日常使用过程中&#xff0c;我们需要定期备份绿洲平台上的数据。以下是备份绿洲平台数据的步骤&#xff1a; 登录绿…

three.js能实现啥效果?看过来,这里都是它的菜(09)

Hi&#xff0c;这是第九期了&#xff0c;继续分享three.js在可视化大屏中的应用&#xff0c;本期分享位移动画的实现。 位移动画 Three.js位移动画是指在Three.js中实现物体位置的平移动画。通过改变物体的位置属性&#xff0c;可以实现物体沿着指定路径从一个位置移动到另一…

Java——图书管理系统万字详解(附代码)

框架搭建 book包 将书相关的放到book包中&#xff0c;创建一个Book类用来设置书的属性&#xff0c;包括书名、作者、价格、类型、是否被借出等。 以上属性均被private所修饰 利用编译器生成构造方法&#xff08;不需要构造isBorrowed&#xff0c;因为其初始值为false&#…

springboot结合baomidou dynamic-datasource组件实现多数据源

dynamic-datasource组件实现多数据源 一、背景介绍二、 思路方案三、过程四、总结五、升华 一、背景介绍 博主最近研发的项目中由于业务需要&#xff0c;在项目中使用到多个数据源。使用到了baomidou的dynamic-datasource组件来实现访问不同的数据源。觉得挺有意思的也是进行了…