leetcode 198. House Robber

今天刷 leetcode 發現了大神操作,對于剛開始刷題的我只能膜拜一下,順便寫個隨筆。

題目:

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input:[1,2,3,1]Output:4Explanation:Rob house 1 (money = 1) and then rob house 3 (money = 3).? ? ? ? ? ? Total amount you can rob = 1 + 3 = 4.

Example 2:

Input:[2,7,9,3,1]Output:12Explanation:Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).? ? ? ? ? ? Total amount you can rob = 2 + 9 + 1 = 12.

簡單說就是,你是個牛X小偷,不存在入室搶劫空手而歸的情況。唯一的難題就是一天晚上不能連著強兩個房子的錢,否則警報就會觸發。每間房子有固定數量的錢,然后需要做的是求最大的一天晚上你能搶多少錢并且不會觸發警報。

看一下大神思路:

https://leetcode.com/problems/house-robber/discuss/156523/From-good-to-great.-How-to-approach-most-of-DP-problems.

動態規劃的題就是先做出暴力遞歸的方法,然后再用數組來代替遞歸。

第一步:找出遞歸關系

兩個選擇:偷這間房子和不偷這間房子。

偷:偷的話就是偷當前的房子和第 i-2 房子。

不偷:不偷就是偷 第 i-1 房子

所以遞歸依據 rob(i) = Math.max(rob(i - 2) + currentHourse, rob(i - 1));

第二步 代碼:

第三步 將遞歸過的記住,避免重復計算:

第四步 取消遞歸:

第五步 降低空間復雜度:

就此就是最優解了,動態規劃就是要一步一步的推,沒有人能一下寫成動態規劃,雖然看了這個方法,下次再寫動態規劃可能還是抓瞎。但是多練習每天進步一點,總能看到效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容