• 动态规划专题: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;
        }
    }
    
  • 相关阅读:
    Check the string
    最简单的
    第七届ACM程序设计竞赛 (SDIBT)
    Cutie Pie
    CSS3 :nth-of-type() 与 nth-child()选择器
    Ajax 完整教程 转载地址:http://www.cnblogs.com/Garden-blog/archive/2011/03/11/1981778.html(转)
    排序:二元选择排序
    排序:堆排序
    排序:直接插入排序 稳定 n*n
    排序:冒泡和改进
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/12558527.html
Copyright © 2020-2023  润新知