leetcode 打家劫舍(動態規劃)

2022-09-15 23:42:28 字數 1185 閱讀 4186

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 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 。

這道題的本質相當於在一列陣列中取出乙個或多個不相鄰數,使其和最大。那麼我們對於這類求極值的問題首先考慮動態規劃dynamic programming來解,我們維護乙個一位陣列dp,其中dp[i]表示到i位置時不相鄰數能形成的最大和,那麼遞推公式怎麼寫呢,我們先拿乙個簡單的例子來分析一下,比如說nums為,那麼我們來看我們的dp陣列應該是什麼樣的,首先dp[0]=3沒啥疑問,再看dp[1]是多少呢,由於3比2大,所以我們搶第乙個房子的3,當前房子的2不搶,所以dp[1]=3,那麼再來看dp[2],由於不能搶相鄰的,所以我們可以用再前面的乙個的dp值加上當前的房間值,和當前房間的前面乙個dp值比較,取較大值當做當前dp值,所以我們可以得到遞推公式dp[i] = max(num[i] + dp[i - 2], dp[i - 1]), 由此看出我們需要初始化dp[0]和dp[1],其中dp[0]即為num[0],dp[1]此時應該為max(num[0], num[1]),**如下

class

solution

int k=0;

for(int i=0;i)

return

dp[k];

}}

方法2:分開a,b通過奇偶分別維護乙個數, 這樣就可以保證組成最大和的數字不相鄰

class

solution

else

b=math.max(b+nums[i],a);

}return

math.max(a,b);

}}

leetcode 動態規劃 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

LeetCode 動態規劃 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 輸入 1,2...

leetcode 打家劫舍 動態規劃分析

階段變數 k表示已經嘗試偷竊了k個房間 0 k k 1 狀態變數 xk表示k階段可以選擇的房間 決策 uk 1,0表示k階段是否能選擇第k個房間 最優指標函式 fx xk 表示前k個房間偷竊最高金額 狀態轉移方程 xk 1 xk uk 1 規劃方程 fk xk max uk 0,1 max 邊界 f...