一、按摩师
题目描述:
题目分析:
1、状态表示
每个预约都只会有两种选择,即选或不选。因此我们可以用
- dp[i][0] 表示不选择第 i 个预约时,最长的预约时长
- dp[i][1] 表示选择第 i 个预约时,最长的预约时长
2、状态转移方程
对于 dp[i][0] :
- 如果我们选择了第 i 个预约,那么第 i-1 次预约就一定不会选择,这时我们只需要知道不选第 i-1 次预约时的最长预约时长即可,即 dp[i-1][0] 的值,再加上 num[i] 即可。可得递推公式就为:
dp[i][1]=dp[i-1][0]+nums[i]
对于 dp[i][1] :
- 如果我们不选择第 i 个预约,那么第 i-1 次预约就可以被选择,当然也可以不选,这时我们只需要知道选或不选第 i-1 次预约时分别的最长预约时长即可,即 dp[i-1][0] 与 dp[i-1][0] 的值,取这两个中的最大值即可。可得递推公式就为:
dp[i][0]=Math.max(dp[i-1][1],dp[i-1][0])
3、初始化
为了避免 i-1 时越界,我们初始化dp表的长度为 n+1,然后从 i=1 开始遍历
要注意下标的映射关系,此时 nums[i-1] 表示nums中第 i 个元素
4、返回值
直接返回 Math.max(dp[n][0],dp[n][1]),因为我们不确定最后一个选不选。
代码实现: