这道题其实和 leetcode—198.打家劫舍 是一样的,典型的dp问题,dp[i]表示在第 i 个请求到来后的总预约时间。我们对于第 i 个预约请求有两种选择(接和不接),接的话则表示他是从第 i-2 个请求过来的(因为不能接相邻的请求),不接的话其总预约时间不变(和dp[i-1]相同)。所以状态转移方程为
d
p
(
i
)
=
m
a
x
(
d
p
(
i
−
1
)
,
d
p
(
i
−
2
)
+
n
u
m
(
i
)
)
dp(i)=max(dp(i-1),dp(i-2)+num(i))
dp(i)=max(dp(i−1),dp(i−2)+num(i))
int massage(vector<int>& nums) {
int n = nums.size();
if(n == 0)
return 0;
else if(n == 1)
return nums[0];
int dp[1000000]={0};
dp[0] = nums[0];
dp[1] = max(nums[1],dp[0]);
for(int i = 2;i < n;i++)
{
dp[i] = max(dp[i-1],dp[i-2] + nums[i]);
}
return dp[n-1];
}
以上代码我们可以在空间上优化,我们每次只关心 d p [ i − 1 ] , d p [ i − 2 ] , d p [ i ] dp[i-1],dp[i-2],dp[i] dp[i−1],dp[i−2],dp[i] 这个值,所以我们只需要三个变量即可,而不需要一个dp数组。
int massage(vector<int>& nums) {
int n = nums.size();
if(n == 0)
return 0;
else if(n == 1)
return nums[0];
int a = nums[0];
int b = max(nums[1],a);
int c = b;
for(int i = 2;i < n;i++)
{
c = max(b,a + nums[i]);
a = b;
b = c;
}
return c;
}