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;
}
}