动规训练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]);}
};

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

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

相关文章

Calico IPIP和BGP TOR的数据包走向

IPIP Mesh全网互联 文字描述 APOD eth0 10.7.75.132 -----> APOD 网关 -----> A宿主机 cali76174826315网卡 -----> Atunl0 10.7.75.128 封装 ----> Aeth0 10.120.181.20 -----> 通过网关 10.120.181.254 -----> 下一跳 BNODE eth0 10.120.179.8 解封装 --…

哈佛大学商业评论 --- 第四篇:一家公司的AR经验

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 专题作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大多…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接&#xff1a;202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题目分析: 为了房便叙述&#xff0c;将「对于⼀个正整数&#xff0c;每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作&#xff1b; 题目告诉我们&#…

什么是原生IP?原生IP的作用是什么?

原生IP&#xff08;Native IP&#xff09;是指直接从互联网服务提供商&#xff08;ISP&#xff09;获得的IP地址&#xff0c;而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联&#xff0c;无需经过任何中间服务器或代理的转发或隐藏&#x…

如何才能实现基坑自动化监测?

基坑自动化监测是一个系统性的过程&#xff0c;它涉及对基坑整体情况的全面了解和分析&#xff0c;确定监测指标&#xff0c;选择合适的监测传感器并进行安装和调试&#xff0c;配置相应的数据采集、传输和管理软件系统&#xff0c;以及进行系统的调试、定期维护和数据分析。以…

uni-app调用苹果登录,并获取用户信息

效果 模块配置 dev中的配置 需要开启登录的权限&#xff0c;然后重新下载配置文件&#xff0c;发布打包基座&#xff0c;再运行程序 代码 <button click"appleLogin">苹果登录</button>function appleLogin() {uni.login({provider: apple,success: …

免版权素材库:在营销和宣传中的重要性与应用

title: 免版权素材库&#xff1a;在营销和宣传中的重要性与应用 date: 2024/4/5 18:21:43 updated: 2024/4/5 18:21:43 tags: 免版权素材库营销宣传高质量素材节省成本避免侵权创意启发数字营销 免版权素材库在宣传和营销中的重要性不言而喻。在当今数字化时代&#xff0c;图片…

html5如何在使用原生开发的情况下实现组件化

我们知道如何在vue/react中使用组件化开发&#xff0c;那么如果只是一个简单的界面&#xff0c;一个HTML就搞定的事情&#xff0c;你还会去新建一个vue/react项目吗&#xff1f; 在使用原生HTML开发时&#xff0c;我们也会遇到一些常见的功能、模块&#xff0c;那么如何在原生…

Flask-RESTful 分析

Flask-RESTful 是一个 Flask 扩展&#xff0c;它为构建 RESTful API 提供了方便的工具和资源。它简化了创建 RESTful 服务的过程&#xff0c;允许开发者专注于业务逻辑而不是 HTTP 协议的细节。 资源&#xff08;Resources&#xff09;&#xff1a; Resource 类&#xff1a;是…

WIFI|软体 茶凳浅谈 高通WIN QSDK - IPQ6000 与 88Q2112 的相遇

Qualcomm IPQ 系列的Ethernet IC 搭配的有 QCA8075, QCA8081 … 等等Qualcomm自家出产的芯片。QSDK中内建可以支持的3rd party芯片&#xff0c;却寥寥可数。日前&#xff0c;客户使用车载以太网 - 88Q2112 - Marvell与IPQ6000做搭配。将之记录下来&#xff0c;以供参考。 方…

程序员延寿指南:科学延寿 20 年 | 开源日报 No.214

geekan/HowToLiveLonger Stars: 28.7k License: Unlicense HowToLiveLonger 是一个程序员延寿指南项目。 该项目旨在提供关于如何延长寿命的指南&#xff0c;特别是针对程序员群体。该项目包括术语、目标、关键结果、分析、行动和证据等内容&#xff0c;涵盖了各种与健康相关的…

C#智慧手麻系统源码 医院手术麻醉系统源码 支持三甲医院评级需求 可提供演示

C#智慧手麻系统源码 医院手术麻醉系统源码 支持三甲医院评级需求 可提供演示 手术麻醉管理系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&#xff0c;采…