【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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章