【dp】Leetcode面试题 17.16. 按摩师

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

在这里插入图片描述
暴力法:对于每个预约都有可选和可不选的两种情况

记忆型递归:暴力法的问题在于有很多重复的子问题,可以使用记忆型递归的方式大大提高效率

动态规划:
dp数组的含义:dp[x]代表在[0......x]范围内能取到的最长预约时间

class Solution {

    public int massage(int[] nums) {
        int n = nums.length;
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int[] dp = new int[n];//dp[x]代表 考虑选择[0 .... x ]范围里的预约 的最大总预约时间
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < n; i++) {
         //遍历迄今为止的最大值,两种情况取较大:
            //1:预约本次,则上一次不预约(dp[i-2] + nums[i])
            //2:本次不预约,则值为预约到上一次的最大值
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[n - 1];
    }


    public static void main(String[] args) {
        System.out.println(new Solution().massage(new int[]{1, 3, 5, 6, 2, 5}));
    }
}

这一题和leetcode 打家劫舍一摸一样的

posted @ 2020-03-24 18:24  bestwell  阅读(187)  评论(0编辑  收藏  举报