动态规划———按摩师

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

输入:[1,2,3,1]

输出:4

解释:选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4

输入:[2,7,9,3,1]

输出:12

解释:选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

解法:

动态规划:第 i 天的选择只有接受预约和不接受两种,而这种选择是受前一天的选择所制约;假如昨天没有选择,那么今天就可以接受预约或不接受,若昨天选择了,则今天不能接受预约。所以可以采用动态规划,今天如果服务的话,最大服务时间是昨天不选择服务的最大服务时间 + 今天的服务时间;假如今天不服务,那么最大服务时间就是昨天不服务或昨天服务这两个值的最大值。所以可以设置数组d[0][i]表示第i天不服务的最大服务时间,d[1][i]则表示第i天服务。


空间优化:因为如果第 i 天服务的话,那么第 i - 1 天必定不能服务,所以最大服务时间d[ i ] = d[ i - 2 ] + nums[ i ],

如果第 i 天不服务的话,那么d[ i ] = d [ i - 1] ,所以综上 d [ i ] = max ( d[ i - 2 ] + nums[ i ] , d [ i - 1] )

你可能感兴趣的:(动态规划———按摩师)