您的位置:首页 > 娱乐 > 八卦 > 小程序推广计划怎么做_广州番禺地图全图_长安seo排名优化培训_网站是怎么建立起来的

小程序推广计划怎么做_广州番禺地图全图_长安seo排名优化培训_网站是怎么建立起来的

2024/10/5 23:26:29 来源:https://blog.csdn.net/2302_76267737/article/details/142526787  浏览:    关键词:小程序推广计划怎么做_广州番禺地图全图_长安seo排名优化培训_网站是怎么建立起来的
小程序推广计划怎么做_广州番禺地图全图_长安seo排名优化培训_网站是怎么建立起来的

目录:

题目链接:面试题 17.16. 按摩师 - 力扣(LeetCode)

一、题目解析

题目:

解析:

二、算法原理

1、状态表示

2、状态转移方程

状态转移方程推理:

3、初始化

dp表初始化:

特殊位置初始化:

4、填表顺序

5、返回值

三、编写代码


题目链接:面试题 17.16. 按摩师 - 力扣(LeetCode)

一、题目解析

题目:

解析:

  由题目我们可知,我们两次选择的预约时间不能相邻,并且题目要求我们最后的结果(预约时长)达到最大。

  拿示例二简单举例:

两种情况:

  • 选1:选1之后我们就不能选2,选3,选3之后不能选4,选5,此时结果为13
  • 不选1:选2,选2之后不能选3,选4,选4之后不能选5,此时结果为10

二、算法原理

1、状态表示

我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

   简单的题目里一般会给出

  • 经验+题目要求

  越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

 分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。

综上:我们通常会以一个位置为结尾或者开始求得我们想要的答案

那我们的这道题得状态表示是什么样的:

根据经验,我们以一个位置为结尾做题

状态表示:dp[i]表示到达i位置时预约时长到达最大

2、状态转移方程

 确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i]等于什么 dp[i]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i]等于什么

  我们根据状态表示再结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

状态转移方程推理:

首先,我们已经知道状态表示为dp[i]为到达i位置时预约时长到达最大值

其次,在题目中还有一个条件,就是相邻的位置不可选

那我们在此就需要对i位置的状态进行分析,我们到底是选择i还是不选i,因为选与不选都有可能使预约时长达到最大值

既然有选与不选两种状态,那么我们的状态转移方程就有两个

我们把表示选择i位置时预约时长达到最大的状态转移方程命名为f(x),把不选择i位置时预约时长达到最大的状态转移方程命名为g(x),原预约时长数组命名为nums

我们对i位置进行一个状态分析:

3、初始化

 我们创建dp表就是为了把他填满,我们初始化是为了防止在填表的过程中越界

怎么谈越界?

我们在填f[0](nums原数组的第一个数)时,我们选择了第一个预约时长,根据状态转移方程中我们求f[0]就需要f[-1],但我们没有f[-1]这个值,这就是越界

dp表初始化:

这里不用对dp表进行初始化

特殊位置初始化:

选择第一个位置:我们需要对f[0]赋值为原数组nums[0],这样我们就不用担心其越界

不选择第一个位置:g[0]就等于0,初始化时已经赋值为0,不用再管这个

4、填表顺序

从左到右依次填表

5、返回值

因为我们有选与不选两种状态,所以我们最后需要比较这两种状态的大小,选择最大的那一个

返回值为max(f[n],g[n]),n为最后一个位置的下标

三、编写代码

class Solution {
public:int massage(vector<int>& nums) {int n=nums.size();
//细节处理,当没有预约时直接返回0if(n==0)return 0;
//两个dp状态表的建立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]);}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com