动态规划-简单多状态dp问题 – 按摩师
题目重现
题目链接:按摩师 - 力扣
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
示例 1:
输入: [1,2,3,1] 输出: 4 解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。
示例 2:
输入: [2,7,9,3,1] 输出: 12 解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。
示例 3:
输入: [2,1,4,5,3,1,1,3] 输出: 12 解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。
算法流程
1.状态表示
这里我们选用较为常用的方式:以某个位置为结尾,定义一个状态表示:
dp[i] 表示:选择到 i 位置时,此时的最长预约时长
但是该题中我们对于每个 i 位置都有 “选择” 和 “不选择” 两种方案,所以对 dp[i] 进行细分为 f[i] 和 g[i] :
- f[i] 表示:选择到 i 位置时,nums[i] 被选择,此时的最长预约时长
- g[i] 表示:选择到 i 位置时,nums[i] 不被选,此时的最长预约时长
2.状态转移方程
由于往常状态表示只有一个,状态转移方程也只有一个