阿亮的演算法之路 213 打家劫舍 II

2021-10-08 10:34:11 字數 1061 閱讀 9334

動態規劃集中練習

動態規劃的典型題目,是上乙個打家劫舍 題目的公升級版,不同的是,上乙個是乙個單鏈,這個是乙個環形。其實核心都是動態規劃,但是就算上乙個題會做,這個題也不一定會做,這裡還有一點需要考慮和處理。(當然方法可能不止一種),

如果以上來就考慮:環形的怎麼寫狀態轉移方程,那麼就很難跳出來。其實,我們想:換成了環形之後,有什麼影響?其實影響就是:偷第乙個就不能偷最後乙個,偷最後乙個就不能偷第乙個

往這個方向思考,就可以很容易的解出來。先假設不偷第乙個,用動態規劃求出到最後乙個的最大值。再不偷最後乙個,把前n-1個的最大值算出來。

再兩者比較,較大的那個就是最終答案。

狀態定義和狀態轉移方程和之前那個題都是一樣的:

public

static

introb

(int

nums)

//如果不偷最後乙個

int[

] dp2 =

newint

[len-1]

; dp2[0]

= nums[0]

; dp2[1]

= nums[0]

>nums[1]

?nums[0]

:nums[1]

;for

(int i =

2; i < len-

1; i++

)//第乙個和最後乙個肯定只能偷乙個,所以返回兩者中最大的乙個

return dp1[len-2]

> dp2[len-2]

?dp1[len-2]

:dp2[len-2]

;}

提交成功,但是應該還有有很大的優化空間,這個只能基本完成功能。

提交結果

又是100%,都見怪不怪了。我猜是:如果程式的執行時間不到1毫秒,都會顯示超過100%,而這個題,只要做出來,可能用時都不會超過1毫秒。所以很多都是超過100%。

213 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...

213 打家劫舍 II

題目描述提示幫助提交記錄社群討論閱讀解答 你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存...

213 打家劫舍 II

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...