你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 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 。
思考:n個房屋,每個房間都有盜取/不盜取兩種可能,類似求子集(暴力搜尋)的方式,在不觸發警報的情況下,選擇總和最大的子集,最多有2^n種可能,時間複雜度為o(n)
貪心演算法是否可行?
例如:在滿足不觸發警報的同時,每次選擇財寶最多的房間
若考慮動態規劃(dp)方法,如何確認dp原問題與子問題、狀態、邊界條件、狀態轉移方程?
由於同時從相鄰的兩個房屋中盜取財寶就會觸發報警器,故:
a、若選擇第i個房間盜取財寶,就一定不能選擇第i-1個房間盜取財寶
b、若不選擇第i個房間盜取財寶,則相當於只考慮前i-1個房間盜取財寶
演算法思路:
1、確認原問題與子問題:
原問題為求n個房間的最優解,子問題為求前1個房間,前2個房間,……,前n個房間的最優解
2、確認狀態:
第i個狀態即為前i個房間能夠獲得的最大財寶
3、確認邊界條件的值:
前1個房間的最優解,第1個房間的財寶
前2個房間的最優解,第1、2個房間的財寶
4、確定狀態轉移方程:
a、選擇第i個房間:第i個房間 + 前i-2個房間的最優解
b、不選擇第i個房間:前i-1個房間的最優解
動態規劃轉移方程:
dp[i] = max(dp[i-1], dp[i-2] + nums[i]);(i >= 3)
class
solution
if(nums.
size()
==1) vector<
int>
dp(nums.
size()
,0);
//設第i個房間的最優解為dp[i]
dp[0]
= nums[0]
; dp[1]
=max
(nums[0]
, nums[1]
);for(
int i =
2; i < nums.
size()
; i++
)return dp[nums.
size()
-1];
}};
LeetCode 198 打家劫舍
題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...
LeetCode198 打家劫舍
你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。簡單的動態規劃問題,題目意思是計算陣列...
LeetCode198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...