leetcode---面試題 17.16. 按摩師

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

以上代碼我們可以在空間上優化,我們每次只關心 dp[i1],dp[i2],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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章