這道題其實和 leetcode—198.打家劫舍 是一樣的,典型的dp問題,dp[i]表示在第 i 個請求到來後的總預約時間。我們對於第 i 個預約請求有兩種選擇(接和不接),接的話則表示他是從第 i-2 個請求過來的(因爲不能接相鄰的請求),不接的話其總預約時間不變(和dp[i-1]相同)。所以狀態轉移方程爲
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數組。
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;
}