1. 程式人生 > >[LeetCode] 198.打家劫舍Ⅰ

[LeetCode] 198.打家劫舍Ⅰ

題目:

你是一個專業的強盜,計劃搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入它會自動聯絡警方

給定一個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒警方的情況下搶劫的最高金額。

思路:

本題的大致意思就是求取一個數組中不相鄰的數的最大值。

這裡,當強盜選取一個房間編號為n去搶劫時,首先需要思考,n號這個房間可不可以被搶劫,即與這個房間相鄰的上一個編號為(n-1)的房間有沒有被搶劫。因此可知,這裡狀態分為2種:

①當上一個相鄰的編號為(n-1)房間已經被搶劫時,則該房間不能被搶劫,此時搶劫得到的最大金額仍和編號為(n-1)房間時相同;

②當上一個相鄰的編號為(n-1)房間沒有被搶劫時,則本次搶劫金額為到編號(n-2)的房間的最大金額加上本次房間的金額。

使用dp[i]表示到第i個房間時得到的最大金額數,得到狀態轉移方程:

dp[i]=max{dp[i-1],dp[i-2]+money[i]};

程式碼:

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int i,dp[100000];
        dp[0]=nums[0];
        dp[1]=nums[0]>nums[1]?nums[0]:nums[1];
        for(i=2;i<nums.size();i++){
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[nums.size()-1];
    }
};