按摩师
- 1. 题目解析
- 2. 讲解算法原理
- 3. 编写代码
1. 题目解析
题目地址:点这里
2. 讲解算法原理
-
首先,给定一个整数数组 nums,其中 nums[i] 表示第 i 天的预约时间长度。
-
定义两个辅助数组 f 和 g,长度都为 n(n 是数组 nums 的长度)。
- 数组 f 表示在第 i 天选择预约时的最大总时长。
- 数组 g 表示在第 i 天选择不预约时的最大总时长。
-
初始化数组 f 和 g 的第一个元素:
- f[0] = nums[0],表示第一天选择预约,总时长为第一天的预约时长。
- g[0] = 0,表示第一天选择不预约,总时长为0。
-
从第二天开始,从左到右遍历整个数组 nums,计算每一天的最大总时长:
- 对于第 i 天,如果选择预约,则总时长为前一天选择不预约的最大总时长 g[i-1] 加上第 i 天的预约时长 nums[i],即 f[i] = g[i-1] + nums[i]。
- 对于第 i 天,如果选择不预约,则总时长为前一天选择预约和不预约的最大总时长中的较大值,即 g[i] = max(f[i-1], g[i-1])。
-
最后,返回最后一天选择预约和不预约的最大总时长的较大值,即 max(f[n-1], g[n-1]),其中 n 是数组 nums 的长度。
3. 编写代码
class Solution {
public:
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],g[0]=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]);
}
};