【leetcode】面試題 17.16. 按摩師(the-masseuse-lcci)(動態規劃)[簡單]

鏈接

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] 即是 兩者的最大值。

狀態轉移方程:dp[i]=max(dp[i1],dp[i2]+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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章