你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有必定的現金。這個地方全部的房屋都圍成一圈,這意味着第一個房屋和最後一個房屋是緊挨着的。同時,相鄰的房屋裝有相互連通的防盜系統,若是兩間相鄰的房屋在同一夜被小偷闖入,系統會自動報警。數組
給定一個表明每一個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的狀況下,可以偷竊到的最高金額。函數
示例 1:測試
輸入: [2,3,2]
輸出: 3
解釋: 你不能先偷竊 1 號房屋(金額 = 2),而後偷竊 3 號房屋(金額 = 2), 由於他們是相鄰的。
示例 2:優化
輸入: [1,2,3,1]
輸出: 4
解釋: 你能夠先偷竊 1 號房屋(金額 = 1),而後偷竊 3 號房屋(金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。spa
此題爲典型的動態規劃問題,可是咱們須要考慮幾種特殊狀況code
此題爲一個環,因此兩端不可並行探索,因此分爲兩種狀況,blog
第一種 探索 0 - (length - 2)
第二種 探索 1 - (length - 1)ip
在考慮只有長度爲1或2的時候ci
綜合考慮數學
先放出全部代碼
/** * @param {number[]} nums * @return {number} */ var rob = function(nums) { //特殊狀況 const len = nums.length if (len === 0) return 0 if (len === 1) return nums[0] if (len === 2) return Math.max(nums[0], nums[1]) const rob = function(nums, start, end) { let pMax = nums[start] let cMax = Math.max(pMax, nums[start + 1]) for (let i = start + 2; i <= end; i++) { console.log(i,cMax,pMax) let tmp = cMax cMax = Math.max((pMax +nums[i]), cMax) pMax = tmp } return cMax } return Math.max(rob(nums, 0, len-2), rob(nums, 1, len-1)) };
動態規劃函數爲 rob
詳細解析下rob
先科普下動態規劃思想
動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep decision process)的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化爲一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。1957年出版了他的名著《Dynamic Programming》,這是該領域的第一本著做。
簡單來講,動態規劃就是尋找每一個階段的最優解
那咱們先按照第一種狀況分析下(從0 到 length - 2)
假設咱們進行測試的數組爲
[3,1,5,12,6,8,13,2]
那咱們探索
首先咱們進行前兩個的探索,而後每加一個數,進行兩種狀況的比較,選出局部最優解
【3,1】最優解爲3 前最優解爲3
【3,1,5】最優解爲8 前最優解爲3 【3 + 5】
【3,1,5,12】最優解爲 3 + 12 = 15 > 8 最優解爲 【3 + 12】前最優解爲8
【3,1,5,12,6】最有解爲 15 > 8 + 6 最優解爲 【3 + 12】前最優解爲 15
【3,1,5,12,6,8】最優解爲 15 + 8 > 15 最優解爲 【3 + 12 + 8】爲23 前最優解爲15
【3,1,5,12,6,8,13】最優解爲 15 + 13 > 23 最優解爲 【3 + 12 + 13】前最優解爲23
【3,1,5,12,6,8,13,2】最優解爲 28 > 23 + 2 最優解爲 【3 + 12 + 13】
依次類推 保證每一個階段都有最優解
最終提交
經過