动态规划专题:LeetCode 按摩师

LeetCode题目

面试题 17.16. 按摩师

思路

  • 为什么要用动态规划

在知道如何使用动态规划前,知道何时使用动态规划最重要吧。

如果你要知道最后一天的值,取决于第三天做不做,这就是二叉树的结构,一般涉及到两个选择的,画下的话,可以看到有重叠部分,可以考虑动态规划。

遇到最值问题的时候,后面的选择取决于前面选择的时候,考虑动态规划。

遇到子序列的(可不连续)的时候,考虑动态规划。

最重要的,看到不会写的时候,考虑动态规划。

  • 写状态转移方程

站在当前考虑,如果昨天接受了,那么今天的值就是昨天的值

如果昨天没接收,那么今天的值就是前面的值加上今天的值。

题目要求最值,所以你今天的值,要是上面两种选择的最值。

所以可以把 dp[i] 设计为第 i 天的最大值。

 dp[i] = Math.max(dp[i-2]+nums[i], dp[i-1]);

实现

class Solution {
    public int massage(int[] nums) {
        if(nums.length==0) return 0;
        if(nums.length==1) return nums[0];
        int len = nums.length;
        
        int[] dp = new int[len];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        int max_min = Math.max(dp[0], dp[1]);
        for (int i = 2; i < len; i++) {
            dp[i] = Math.max(dp[i-2]+nums[i], dp[i-1]);
            max_min = Math.max(max_min, dp[i]);
        }
        System.out.println(Arrays.toString(dp));
        return max_min;
    }
}
posted @ 2020-03-24 13:40  土堆碎念  阅读(380)  评论(0编辑  收藏  举报