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