欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-05 15:47:34
...

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

【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 打家劫舍一摸一样的

相关标签: leetcode解题