【每日算法Day 105】打家劫舍第二彈:看好你的電瓶車!

題目鏈接

LeetCode 213. 打家劫舍 II[1]

往期回顧:打家劫舍 I :
【每日算法Day 104】偷電瓶的周某今天放出來了,還不趕緊做這道題防範一下![2]

題目描述

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味着第一個房屋和最後一個房屋是緊挨着的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例1

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

示例2

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

題解

這題和上一題唯一區別就是首尾只能選一個偷,那麼我們可以分爲兩種情況。

如果不偷第一個,那麼問題就變成了在後 n-1 個裏面偷取的最大價值。

如果不偷最後一個,那麼問題就變成了在前 n-1 個裏面偷取的最大價值。

而這兩個轉化後的問題就沒有首尾連接的約束了,可以直接採用上一題的解法求解,轉移方程還是:

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

最終取兩種情況的較大值就行了。

代碼

c++

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

    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];
        int a = rob1(nums, 0, n-2);
        int b = rob1(nums, 1, n-1);
        return max(a, b);
    }
};

      

參考資料

[1]

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

[2]

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

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