链接
https://leetcode-cn.com/problems/the-masseuse-lcci/
耗时
解题:1 h+
题解:30 min
题意
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。但她不接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
给定一个数组,每个数都可以选择拿或者不拿,但是相邻的两个数不能同时拿,问拿到的数字加起来的和最大可以是多少?
思路
01背包思路。问题可以分解为子问题,长度为 n 的序列 与 长度为 n-1 的序列解法相同。dp 有一维,长度为序列的长度,dp[i] 表示前 i 个预约的最长总预约时间。第 i 个预约可以选择接或者不接,不接即继承 dp[i-1],如果接即是 dp[i-2] + 第 i 个预约的时长。dp[i] 即是 两者的最大值。
状态转移方程: d p [ i ] = m a x ( d p [ i − 1 ] , d p [ i − 2 ] + n u m s [ i ] ) dp[i] = max(dp[i-1], dp[i-2]+nums[i]) dp[i]=max(dp[i−1],dp[i−2]+nums[i])
初始化的时候需要注意第二个预约没有前前一个预约,那么在第一个预约之前添加一个 0 即可。
AC代码
class Solution {
public:
int massage(vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
vector<int> dp(n+1);
dp[0] = 0;
dp[1] = nums[0];
for(int i = 1; i < n; ++i) {
dp[i+1] = max(dp[i], dp[i-1]+nums[i]);
}
return dp[n];
}
};