動態規劃集中練習
動態規劃的典型題目,是上乙個打家劫舍 題目的公升級版,不同的是,上乙個是乙個單鏈,這個是乙個環形。其實核心都是動態規劃,但是就算上乙個題會做,這個題也不一定會做,這裡還有一點需要考慮和處理。(當然方法可能不止一種),
如果以上來就考慮:環形的怎麼寫狀態轉移方程,那麼就很難跳出來。其實,我們想:換成了環形之後,有什麼影響?其實影響就是:偷第乙個就不能偷最後乙個,偷最後乙個就不能偷第乙個
往這個方向思考,就可以很容易的解出來。先假設不偷第乙個,用動態規劃求出到最後乙個的最大值。再不偷最後乙個,把前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
你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...