打家劫舍(滾動陣列)

2021-10-06 15:00:19 字數 1225 閱讀 2906

滾動陣列是dp中的一種程式設計思想。簡單的理解就是讓陣列滾動起來,每次都使用固定的幾個儲存空間,來達到壓縮,節省儲存空間的作用。

比如斐波那契額數列

d[0]

=1; d[1]

=1;for

(i=2

;i<

80;i++

) d[i]

=d[i-1]

+d[i-2]

;

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

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

輸入: [1,2,3,1]

輸出: 4

解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。

偷竊到的最高金額 = 1 + 3 = 4 。

輸入: [2,1,1,3]

輸出: 5

如果只有一間房,則偷取。如果有兩件房,則偷兩間房中數額大的那件。設定乙個dp容器,訪問當前i間房時候的最優解。當有k間房,有兩種方案:

所以 dp[i] = max(dp[i-2]+nums[i],dp[i-1])

class

solution

return dp[size-1]

;}};

上述使用了陣列儲存當期最優解,考慮到每間房屋的最高總金額只和該房屋的前兩間房屋的最高總金額相關,因此可以使用滾動陣列,在每個時刻只需要儲存前兩間房屋的最高總金額。

class

solution

int size = nums.

size()

;if(size ==1)

int first = nums[0]

, second =

max(nums[0]

, nums[1]

);for(

int i =

2; i < size; i++

)return second;}}

;

滾動陣列詳解

滾動陣列 可以想象成顯示屏,對於有很多的數字來說,每次只顯示有限的數字,用完 顯示完 就向後移動一位,顯示的數量不變,但是在卡記憶體比較緊的題中,可以節省很多空間。最典型的就是斐波那契數列,普通的求解方法不外乎就是用遞推式f i f i 1 f i 2 但是這個如果資料量大的話會爆記憶體,而用滾動陣...

筆記 滾動陣列!

滾動陣列。對於我這種不會用結果怕各種mle和各種tle的人來說確實是一向短處 滾動的實質 膜法光輝 霧 吐槽不多說現在我們來看一下 乙個dp,平常如果需要1000 1000的空間,其實根據dp的無後效性,可以開成2 1000,然後通過滾動,獲得和1000 1000一樣的效果。滾動陣列常用於dp之中,...

Top Secret Task dp 滾動陣列

傳送門 題目 dp i j k 表示 考慮到第i個數 計算前j個數的和 進行了k次操作 則有若不把第i個數放入前j個數中 dp i j k dp i 1 j k 若把第i個數放入前j個數中 至少需要把第i個移到第j個,即進行i j次操作 if k i j dp i j k dp i 1 j 1 k ...