动态规划专题: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;
}
}