LeetCode 198.打家劫舍

一,問題描述

二,問題分析

       每一間房屋你都有偷或者不偷兩種選擇,且不可偷相鄰的房屋,從最後一項開始分析,到最後一間房子n能夠的最大金額有兩個來源,一是不偷最後一間房屋,得到前n-1項房屋的最大值,二是偷最後一間房屋那麼就不偷第n-1的房屋,那麼最大金額就是前 n-2間房屋的最大值加上偷最後一間房屋的金額。兩種情況取最大值即可,很明顯滿足最優子結構。

1.定義狀態 dp[i] :表示0-i所房屋能夠偷取的最大值

2.初始狀態:dp[0] = nums[0];

                     dp[1] = max(nums[0],nums[1]);

2.狀態轉移:dp[i] = max(dp[i-1],dp[i-2]+nums[i]);

三,問題解答

class Solution {
public:
    int rob(vector<int>& nums) {
    //dp[i] : 表示前 i 個房屋能夠獲得的最大值
    int len = nums.size();
    if(len == 0){        //輸入情況是空即 nums = [];
        return 0;
    }
    if(len == 1){        //輸入情況只有一個房屋即 nums = [ i ];
        return nums[0];
    }
    vector<int> dp(len);
    dp[0] = nums[0];            //初始狀態
    dp[1] = max(nums[0],nums[1]);
    for(int i=2;i<len;i++){        //狀態轉移
        dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
    }
    return dp[len-1];         //返回最大值
    }
};

 

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