2020-03-24 按摩師

一個(gè)有名的按摩師會(huì)收到源源不斷的預(yù)約請求,每個(gè)預(yù)約都可以選擇接或不接。在每次預(yù)約服務(wù)之間要有休息時(shí)間,因此她不能接受相鄰的預(yù)約。給定一個(gè)預(yù)約請求序列,替按摩師找到最優(yōu)的預(yù)約集合(總預(yù)約時(shí)間最長),返回總的分鐘數(shù)。

注意:本題相對原題稍作改動(dòng)

示例 1:

輸入: [1,2,3,1]
輸出: 4
解釋: 選擇 1 號預(yù)約和 3 號預(yù)約,總時(shí)長 = 1 + 3 = 4。
示例 2:

輸入: [2,7,9,3,1]
輸出: 12
解釋: 選擇 1 號預(yù)約、 3 號預(yù)約和 5 號預(yù)約,總時(shí)長 = 2 + 9 + 1 = 12。
示例 3:

輸入: [2,1,4,5,3,1,1,3]
輸出: 12
解釋: 選擇 1 號預(yù)約、 3 號預(yù)約、 5 號預(yù)約和 8 號預(yù)約,總時(shí)長 = 2 + 4 + 3 + 3 = 12。

來源:力扣(LeetCode)

C++1 動(dòng)態(tài)規(guī)劃

1、當(dāng)預(yù)約請求長度為0時(shí),返回0
2、當(dāng)預(yù)約長度為1時(shí),就選擇這一天
3、使用一維數(shù)組記錄當(dāng)天的最長預(yù)約,如果選擇接第i個(gè)預(yù)約,則前一天不能接預(yù)約請求,需要從第i-2個(gè)預(yù)約轉(zhuǎn)移過來;如果不接第
i個(gè)預(yù)約請求,第i-1個(gè)預(yù)約接還是不接都可以,則可以從第i-1個(gè)請求轉(zhuǎn)移過來。取兩種選擇的最大值即可。

此方法采用自底向上的動(dòng)態(tài)規(guī)劃,遞推方程:
res_dp[i] = max(res_dp[i - 1], res_dp[i - 2] + nums[i])

class Solution {
public:
    int massage(vector<int>& nums) {
        int s = nums.size();
        if(s == 0){
            return 0;
        }
        if(s == 1){
            return nums[0];
        }
        vector<int> res_dp(s,0);
        res_dp[0] = nums[0];
        res_dp[1] = max(nums[0],nums[1]);
        for(int i=2;i<s;i++){
            res_dp[i] = max(res_dp[i-1], res_dp[i-2]+nums[i]);
        }
        return res_dp[s-1];
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容