天天看點

LeetCode-【動态規劃】-打家劫舍

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房内都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有互相連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

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

示例 1:

輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 号房屋 (金額 = 1) ,然後偷竊 3 号房屋 (金額 = 3)。
     偷竊到的最高金額 = 1 + 3 = 4 。
           

示例 2:

輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 号房屋 (金額 = 2), 偷竊 3 号房屋 (金額 = 9),接着偷竊 5 号房屋 (金額 = 1)。
     偷竊到的最高金額 = 2 + 9 + 1 = 12 。
           

題解:先從簡單的思路開始

隻有一家:[1] ,偷到的最高金額就是1

有兩家:[1,2],偷到的最高金額就是這兩家中的最大值2

有三家:[1,2,3],這時偷到的最高金額就是第一家和第三家的和4,這裡會有個判斷,如果先從第二家開始偷是否會比先從第一家偷後的金額多,最後金額就是去這兩種情況中的最大值,

有四家:[1,2,3,4],這時我們能看出偷出的最高金額是6,那麼又是怎麼判斷出來的呢,周遊數組,把從第一家開始偷到最後獲得的總金額算出來,再把從第二家開始偷到最後的總金額算出來,選擇其中數值較大的那個,是這樣嗎,好像不是,題目要求不讓偷相鄰的意思是允許一次隔大于等于一家進行偷,而不是固定隻能隔一家偷。那又該怎樣解決這個問題呢,先看一種特殊情況[2,1,1,2],這時最後偷得最大金額是4,我們可以這樣想從第一家開始,第一家最大偷盜金額是2,第二家也是2,第三家是3,第四家是4,這裡我們需要注意的是這裡第四家計算的時候是第二家能偷到的最大金額加上第四家偷到的金額與第三家能偷到的最大金額的最大值,體會一下。

class Solution {
    public int rob(int[] nums) {
        int n=nums.length;
        if(n==0)
            return 0;
        if(n==1)
            return nums[0];
        if(n==2)
            return Math.max(nums[0],nums[1]);
        int[] dp=new int[n];
        dp[0]=nums[0];
        dp[1]=Math.max(nums[0],nums[1]);
        for(int i=2;i<n;i++){
            dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[n-1];
    }
}