代码展示:
class Solution {
public int massage(int[] nums) {
int n=nums.length;
if(n==0){
return 0;
}
//创建数组
int f[]=new int[n]; //f[i]表示接i位置的最长时间
int g[]=new int[n]; //g[i]表示不接i位置的最长时间
//初始化
f[0]=nums[0];g[0]=0;
//填充数组
for(int i=1;i<=n-1;i++){
f[i]=g[i-1]+nums[i];
g[i]=Math.max(f[i-1],g[i-1]);
}
//返回值
return Math.max(f[n-1],g[n-1]);
}
}
通过动态规划来解决该问题,通过动态规划的5大步骤分析解决
1.状态表示
在该题中对于每一个预约,我们有接受和不接受两个选择,而不同的选择会有不同的结果,所以我们可以用f【i】来表示接受i位置的预约所得到的最长预约时长,用g【i】来表示不接受i位置的预约所得到的最长时长。所以该题要用到两个数组
2.状态转移方程
从最近的一步进行分析,对于i位置的预约来说,我们可以选择接受和不接受
接受:接受了i位置的预约,我们便不能接受i-1位置的预约,而不接受i-1位置的预约后的最长时长为g【i-1】,再加上i位置的预约时长便是接受了i位置预约的最长时长,即f[i]=g[i-1]+nums[i];
不接受:不接受i位置的预约,我们此时可以选择接受i-1位置的预约,也可以选择不接受i-1位置的预约,由于要选择最长时长,所以我们要比较接受i-1位置预约的时长和不接受i-1位置预约的时长即f【i-1】的值和g【i-1】值,选择较大的一方,即 g[i]=Math.max(f[i-1],g[i-1]);
3.初始化
根据状态转移方程,只有0下标会溢出,则初始化0下标即可。
4.填充数组
根据状态转移方程从左到右填充两个数组
5.返回值
最后我们得到了对于最后一个预约接受时的最长时长j【n-1】,和不接受时的最长时长g【n-1】,我们通过比较选择较大的即可,即 return Math.max(f[n-1],g[n-1]);