【每日算法Day 104】偷電瓶的周某今天放出來了,還不趕緊做這道題防範一下!...

偷電瓶的周某今天(2020.04.18)出來啦,打工是不可能打工的,這輩子都不可能打工的,大家可要小心咯。 今天開始講解 LeetCode 打家劫舍系列三道題目,給大家防範一下!

題目鏈接

LeetCode 198. 打家劫舍[1]

題目描述

題面描述略有改動,不影響題意。

你是一個專業的小偷,計劃偷竊沿路的電瓶車電瓶。每個電瓶價值不一樣,影響你偷竊的唯一制約因素就是相鄰的電瓶車裝有相互連通的防盜系統,如果兩輛相鄰的電瓶車的電瓶同時被偷,系統會自動報警。

給定一個代表每輛電瓶車電瓶價值的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例1

        輸入:
[1,2,3,1]
輸出:
4
      

示例2

        輸入:
[2,7,9,3,1]
輸出:
12
      

題解

dp[i] 表示偷前 i 輛車電瓶可以獲得的最大價值,那麼對於第 i 輛車來說,有兩種選擇。

如果偷第 i 輛車的電瓶,那麼第 i-1 輛車電瓶就不能偷了,能獲得的最大價值就是 dp[i-2] + p[i]

如果不偷第 i 輛車的電瓶,那麼最大價值就等價於偷前 i-1 輛車的電瓶能獲得的最大價值 dp[i-1]

所以最終取兩者最大值即可:

dp[i] = \max{\{dp[i-1], dp[i-2]+p[i]\}} \\

可以發現,每次計算其實只要用到前兩個元素,所以每次維護最後兩個值即可,可以將空間優化到常數空間。

代碼

c++

        class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        int prepre = 0, pre = 0, now = 0;
        for (int i = 0; i < n; ++i) {
            now = max(pre, prepre+nums[i]);
            prepre = pre;
            pre = now;
        }
        return now;
    }
};

      

參考資料

[1]

LeetCode 198. 打家劫舍: leetcode-cn.com/problem

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章