动规训练3

一、按摩师

1、题目解析

简而言之就是,找到一个按摩师的预约总是长的最长方案,还有一个限制条件,选取的预约两两不相邻。

2、算法原理

a状态表示方程

小技巧:经验+题目要求

dp[i]表示以这个节点为结尾,最长的预约时长

b状态转移方程

1、找到最近的一个节点,划分问题

2、预约节点两两不相邻

dp[i]的值如何得出呢——找到前两个节点进行对比一下,取最大值再加上我这个值

最近的节点dp[i-1]不可考虑,因为相邻了

dp[i]=min(dp[i-2],dp[i-3])+nums[i]

有些同学就开始纠结了,为啥不考虑i-4的情况呢————因为i-2包括了

c初始化

根据上面的推断,可能会遇到边界问题的节点为0,1,2  。

所以我们可以给这三个节点进行初始化。  

也可以通过虚拟节点的方法进行解决

虚拟节点注意事项:

  1. 初始化取值需要保证后续填表值的正确性
  2. 注意下标映射关系

我们选择的初始化取值为0,这样不会影响到后续取值,并且向nums取值时应该i-3

以下图为例

d填表顺序

从左到右

e返回值

dp表的最后两个节点的较大值

max(dp[n+2],dp[n+1])

3、代码

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

4、解法2

算法原理

a状态表示方程

dp[i]表示以i为终点时的最大值

但是这个节点有两种情况:

f[i]表示以i为终点并且选了i节点值时的最大值

g[i]表示以i为终点时没有选择i节点的最大值

b状态转移方程

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

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

c初始化

f[0]=nums[0]

g[0]=0

d填表顺序

从左到右,两个表一起填

e返回值

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

n为nums大小

f代码

class Solution {
public:
 int massage(vector<int>& nums) {
 // 1. 创建⼀个 dp 表
 // 2. 初始化
 // 3. 填表
 // 4. 返回值
 int n = nums.size();
 if(n == 0) return 0; // 处理边界条件
 vector<int> f(n);
 auto g = f;
 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]);
 }
};

二、打家劫舍二

1、题目解析

第一道题契税就是这道题的变体,不同的是这道题多了一个要求——数组首尾相连

2、算法原理

a状态表示方程

经验+题目要求

dp[i]表示到这个i节点时最大的盗窃金额

但是这个值有两种情况,分别是选择了这个节点和没选择这个节点

f[i]表示i节点被盗窃时的最大金额

g[i]表示i节点没盗窃时的最大金额

这两者取的较大值就是dp[i]的值

但是这道题是一个环形数组,为了针对这一变数,有一个解决方法:

你不是环形数组嘛,说白了就是第一位被盗窃了和没被盗窃两种情况

既然分了两种情况,我们进行两次盗窃,看哪次盗窃结果更大就行了。

偷盗了第一所房子——这就意味着1和n-1(第二位和最后一位不可以盗窃了),从第三位开始盗窃直到倒数第二位

没有盗窃第一所房子———这意味着需要从第一位盗窃至最后一位。

b状态转移方程

找到最近的节点划分问题

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

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

c初始化

f[0]=nums[0]

g[0]=0

d填表顺序

从左到右,两种情况分别填写两张表

e返回值

return max(rob1(nums,1,n-1),rob1(nums,2,n-2)+nums[0]); 

3、代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        if(n==1)
            return nums[0];
    
        return max(rob1(nums,1,n-1),rob1(nums,2,n-2)+nums[0]); 
    }
    int rob1(vector<int> nums,int left,int right){
        vector<int> f(right+1,0);
        vector<int> g(right+1,0);
        for(int i=left;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]);
    }
};

三、删除并且获得点数

1、题目解析

这道题就是将一个数删除然后获取这个数的点数,同时将+-1的数删除去补货的值,依次删除求获取的最大点数。

我们需要锻炼一种能力,将一道陌生的题目往我们熟悉的题目上联想————这其实不就是打家劫舍问题的变体吗,取一个值然后两两取值不能相邻。

这道题我们无法在原数组上获取数据,需要转换成一个行的数组arr,将每个数的和储存起来,通过下标来表示这个数,并且前后需要个例的数值一目了然

2、算法原理

a状态表示方程

b状态转移方程

c初始化

d填表顺序

e返回值

3、代码

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        //预处理
        //建表
        //初始化
        //填表
        //返回值
        int arr[10001]={0};
        for(int i=0;i<nums.size();i++){
            arr[nums[i]]+=nums[i];
        }
        int f[10001];
        int g[10001];
        f[0]=arr[0];
        g[0]=0;
        for(int i=1;i<=10000;i++){
            f[i]=g[i-1]+arr[i];
            g[i]=max(f[i-1],g[i-1]);
        }
        return max(f[10000],g[10000]);
    }
};

四、粉刷房子

1、题目解析

题目的意思是给了我们一排房子,这一排房子不能刷上相同的颜色,让我们求最便宜的装修方案

题目给了我们一个二维数组,这个二维数组

这个二维数组从上到下写的是一个房子对应的颜色价格。

很多同学犯难了,不知道这个和动态规划有什么关联,或者不知道如何转化成动规问题。

就像动规的简化问题一样,我们需要问题转换成会写的问题来简化我们的问题。

我们写到过一道题下降路径最小和,我们将改题转换成这个问题。

将二维数组竖着看,表上横向写的是颜色对应的价格,竖向表示对应的楼房

2、算法原理

a状态表示方程

小技巧:经验+题目要求

dp[i][j]表示,到达该节点的时候,最小的专修价格。

b状态转移方程

小技巧:通规最近的一步简化问题

图中节点有且仅有两种可能,左上和右上这两种情况。

而这张图上也是两个节点对应的两个解决方法。

这其实也是这道题的影藏条件。

而dp[i][j]取值取两者较小值就行了。

c初始化

给dp第一排赋值即可

d填表顺序

从左到右,从上到下

e返回值

min(min(dp[m-1][0],dp[m-1][1]),dp[m-1][2])

3、代码

class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int m=costs.size();
        vector<vector<int>> dp(m,vector<int> (3));
        dp[0][0]=costs[0][0];
        dp[0][1]=costs[0][1];
        dp[0][2]=costs[0][2];
        for(int i=1;i<m;i++){
            dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0];
            dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i][1];
            dp[i][2]=min(dp[i-1][0],dp[i-1][1])+costs[i][2];
        }
        return min(min(dp[m-1][0],dp[m-1][1]),dp[m-1][2]);
    }
};

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

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

相关文章

鸿蒙开发第一课-工具与HelloWorld

武汉数字人才实训基地 一、初始HarmonyOS以及DevEco Studio 2023年8月4日&#xff0c;HarmonyOS 4.0操作系统正式发布。华为鸿蒙Next&#xff08;HarmonyOS Next&#xff09;操作系统开发者预览版(Developer Preview)发布。超过7亿台设备搭载了HarmonyOS 系统 2024年&#xf…

tigramite教程(七)使用TIGRAMITE 进行条件独立性测试

文章目录 概述1 连续数值变量1.1 ParCorr 偏相关&#xff08;ParCorr类&#xff09;1.2 鲁棒偏相关&#xff08;RobustParCorr&#xff09;非线性检验1.3 GPDC1.4 CMIknn 2a. 分类/符号时间序列2b. 混合分类/连续时间序列多变量X和Y的测试 概述 这个表格概述了 X ⊥ Y ∣ Z X\…

挑选人力资源管理系统,专家推荐的6款必看!

在当今数字化时代&#xff0c;人力资源管理系统已成为企业高效运营和持续发展的重要工具。本文为您介绍的6款好用的人力资源管理系统有Zoho People、金蝶人力云、Workday、北森eHR、用友人力云、易路&#xff0c;帮助您找到最适合自己企业的解决方案。 一、Zoho People Zoho P…

汽车网络安全管理

汽车网络安全管理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

《C++程序设计》阅读笔记【3-数组】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 数组1.1 概述1.2 数组初始化1.2.1 概述1.2.2 字符数组的初始化1.2.…

流行的API架构学习

几种流行的API架构风格图 SOAP&#xff08;Simple Object Access Protocol&#xff09; 优点&#xff1a;SOAP 是一种基于 XML 的通信协议&#xff0c;具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能&#xff0c;并支持复杂的消息交换模式。 缺点&#xf…

buu刷题(2)

[护网杯 2018]easy_tornado web buuctf [护网杯 2018]easy_tornado1_[护网杯 2018]easy_tornado 1-CSDN博客 render是渲染HTML页面用到的函数 这应该是一个模板注入漏洞 访问/fllllllllllllag&#xff0c;自动跳到了这个页面&#xff0c;可以看到 url 上有个msgError, 尝试将…

力扣 904.水果成篮

题目&#xff1a; 题目理解&#xff1a;fruits里的每个数字表示一种类型水果&#xff0c;相同数字表示同种类型水果。 class Solution {public int totalFruit(int[] fruits) {// 用HashMap来表示篮子&#xff0c;key表示水果类型&#xff0c;value表示多少颗树Map<Intege…

工厂车间系统|基于springboot的工厂车间管理系统设计与实现(附项目源码+论文)

基于springboot工厂车间管理的设计与实现 一、摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱…

R语言数据操纵:如何构建子集

目录 向量的子集 矩阵的子集 数据框的子集 列表的子集 如何处理缺失值 向量化操作 构建子集的基本方法&#xff1a; 1.使用[]提取一个或多个类型相同的元素 2.使用[[]]从列表或者数据框中提取元素 3.使用$按名字从列表或数据框中提取元素 向量的子集 比如有一个向量…

uniapp:小程序腾讯地图程序文件qqmap-wx-jssdk.js 文件一直找不到无法导入

先看问题&#xff1a; 在使用腾讯地图api时无法导入到qqmap-wx-jssdk.js文件 解决方法&#xff1a;1、打开qqmap-wx-jssdk.js最后一行 然后导入&#xff1a;这里是我的路径位置&#xff0c;可以根据自己的路径位置进行更改导入 最后在生命周期函数中输出&#xff1a; 运行效果…

mybatis流式游标查询-导出DB大数据量查询OOM问题

问题场景 Mysql数据处理类型分以下三种 com.mysql.cj.protocol.a.result.ResultsetRowsStatic&#xff1a;普通查询&#xff0c;将结果集一次性全部拉取到内存 com.mysql.cj.protocol.a.result.ResultsetRowsCursor&#xff1a;游标查询&#xff0c;将结果集分批拉取到内存&…

【Python基础教程】5. 数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

文本处理语言awk基本语法

文章目录 运算符流程控制函数封装 awk语言初步 AWK 是一种强大的文本处理和数据解析工具&#xff0c;它支持丰富的运算符和流程控制语句。运算符方面&#xff0c;AWK 提供了基本的算术运算符&#xff08;, -, *, /, %, ^, **&#xff09;和赋值运算符&#xff08;, -, *, /, %…

【QT+QGIS跨平台编译】056:【pdal_json_schema+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_json_schema介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_json_schema介绍 pdal_json_schema 是与 PDAL(Point Data Abstraction Library)相关的 JSON 模式文件。PDAL 是一个用于处理和分析点云数据的开源库。JSON 模式…

常见寻找 SQL 注入漏洞方法总结

一、借助推理进行测试 识别 SOL 注入漏洞有一种简单的规则:通过发送意外数据来触发异常。该规则包括如下含义: 1. 识别 Web 应用上所有的数据输入。 2. 了解哪种类型的请求会触发异常。 3. 检测服务器响应中的异常。 二、通过参数判断 假设你正在访问一个网站&#xff0c…

NoSQL之Redis配置

文章目录 NoSQL之Redis配置一、关系数据库和非关系数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库的区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同 5、总结5.1 关系型数据库5.2 非关系型数据库 二、Redi…

Spring-IoC 基于注解

基于xml方法见&#xff1a;http://t.csdnimg.cn/dir8j 注解是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理&#xff0c;简化 Spring的 XML配置。 格式&#xff1a;注解(属性1"属性值1",...) 可以加在类上…

大数据基础设施搭建 - Spark

文章目录 一、解压压缩包二、修改配置文件conf/spark-env.sh三、测试提交Spark任务四、Spark on Hive配置4.1 创建hive-site.xml&#xff08;spark/conf目录&#xff09;4.2 查看hive的hive-site.xml配置与3.1配置的是否一致4.3 测试SparkSQL4.3.1 启动SparkSQL客户端&#xff…

【JAVA】JAVA快速入门(长期维护)

下面是java的一些入门基础知识&#xff0c;有需要借鉴即可。 课程&#xff1a;B站黑马程序员&#xff0c;JAVA入门LINK 一、初识JAVA 1.java概述 概念&#xff1a;java是由sun公司研发&#xff0c;在2009年被oracle收购&#xff0c;祖师爷詹姆斯高斯林&#xff0c;是一种高级…