打家劫舍 簡單的動態規劃,為什麼我實現的如此複雜

2021-10-06 15:31:53 字數 962 閱讀 6867

今天遇上的是典型的動態規劃問題,只是我實現的不夠優雅。leetcode原題位址

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

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

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

題目是乙個典型的動態規劃問題。簡單說,就是相鄰兩個最多選乙個,連續三個,至少選乙個。我實現的複雜,用了兩個陣列記錄狀態

public int

rob(

int[

] nums)

return math.

max(yes[n-1]

, no[n -1]

);}

我看了官方的提示,**可以優化,只用到前兩個店的資訊,用兩個變數記錄就可以了。

public int

rob(

int[

] nums)

return second;

}

將抽象的問題具體化,這個題,就是想到動態轉移方程,就可以解決了。

動態規劃為什麼可以減少計算

摘自leetcode 動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分 即子問題 再根據子問題的解以得出原問題的解。動態規劃往往用於優化遞迴問題,例如斐波那契數列,如果運用遞迴的方式來求解會重複計算很多相同的子問題,利用動態規劃的思想可以減少計算量。通常許多子問題非常...

為什麼你不會動態規劃?

動態規劃 dynamic programming 是刷題中最常見也最重要的乙個類別,在研發崗位面試中往往佔據著重要地位。對於刷題,要寫在前面的是肯定要通過大量的練習和自身體會去把握每種題型的思路,這是大前提。不過動態規劃 以下用dp代替 屬於沒有公式的題型,這種題的特點是可能你花了很長時間去練習,卻...

簡單的動態規劃思想

原題 題解 這道題完全不需要貪心。引理 1 紙牌一定可以分到一樣多。題目條件 2 相鄰兩堆牌間最多隻會移動紙牌一次。最優方案 每次移動可以看作相鄰兩堆中左邊一堆i往右邊一堆i 1移動x張 1 x 0 左往右移動1次 2 x 0 右往左移動1次 3 x 0 不移動。當且僅當此時牌堆1 i總牌數為i 總...