鏈接
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] 即是 兩者的最大值。
狀態轉移方程:
初始化的時候需要注意第二個預約沒有前前一個預約,那麼在第一個預約之前添加一個 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];
}
};