[LeetCode] 198.打家劫舍Ⅰ
阿新 • • 發佈:2019-01-22
題目:
你是一個專業的強盜,計劃搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡警方。
給定一個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒警方的情況下搶劫的最高金額。
思路:
本題的大致意思就是求取一個數組中不相鄰的數的最大值。
這裡,當強盜選取一個房間編號為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]; } };