社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
这道题其实和 leetcode—198.打家劫舍 是一样的,典型的dp问题,dp[i]表示在第 i 个请求到来后的总预约时间。我们对于第 i 个预约请求有两种选择(接和不接),接的话则表示他是从第 i-2 个请求过来的(因为不能接相邻的请求),不接的话其总预约时间不变(和dp[i-1]相同)。所以状态转移方程为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];
}
以上代码我们可以在空间上优化,我们每次只关心 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;
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!