leedcode 198 打家劫舍 動態規劃

2021-09-27 11:28:32 字數 1429 閱讀 1336

太不容易了,總算是學會了最基礎的動態規劃。

動態規劃是什麼不需要再綴述(每次決策依賴於當前狀態,又隨即引起狀態的轉移。乙個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。),

動態規劃的使用場景一般包括三個特徵:

最優子結構:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構。

無後效性:某一狀態一旦確定,就不受這個狀態的以後的決策影響。

動態規劃經典題型:

最長遞增子串行

最長公共子串行

最長公共子串

最大子串行和

動態規劃有乙個經典的思想:選或不選

即:在比較在該時刻(情況)下,比較「選」或者「不選」所產生的結果,選其中更符合情況的。

下面以leedcode上的一道題目為例:

可以理解為:最大不連續子串行求解問題

應用到這道題目上:

狀態轉移方程:

opt(i) = max(vi+opt(i-2),opt(i-1))

其中:vi+opt(i-2):表示選擇當前i位置(房間)情況下可以盜竊到的金額

opt(i-1):表示不選當前i位置(房間)情況下可以盜竊到的金額

vi:當前i房間的金額

關鍵:opt[i]表示從下標為0的房間開始盜竊到下標為i的房間時可以盜竊到的最大金額(求解範圍是0-i)

注意點:

如果i房間被盜,所以i-1號房間不能被盜,所以在前i個房間裡面選擇盜竊金額之和為vi+opt(i-2)如果i房間沒有被盜,所以i-1號房間可以被盜,因此在前i-1個房間裡面選擇盜竊金額之和為opt(i-1)不向後考慮:即到第i號房間時,只考慮前面i-1房間能否被盜,而不考慮i+1房間能否被盜

**:

/*

* 遞迴,非記憶化搜尋

*/// 到i房間,能夠偷竊到的最高金額

varrecopt

=function

(arr,i)

}var

rob=

function

(nums)

};

/*

*非遞迴方式,記憶化搜尋

*/var

dpopt

=function

(arr)

return opt[arr.length-1]

;}varrob

=function

(nums)

};

198 打家劫舍

很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...

198 打家劫舍

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

198 打家劫舍

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