演算法 打家劫舍

2021-10-04 13:42:26 字數 1179 閱讀 7336

打家劫舍是乙個easy類的題目leetcode-198,主要考察的就是動態規劃,由此延伸出的拿糖果問題等就是在這道題上套個殼子。

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

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

示例 1:

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

輸出: 4

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

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

示例 2:

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

輸出: 12

解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。

偷竊到的最高金額 = 2 + 9 + 1 = 12 。

不考慮邊界條件,核心**就這一句:dp[i]=math.max(dp[i-1],dp[i-2]+nums[i]);

即當前能拿的最大值為前兩步和本步收益之和與前一天的收益的最大值

dp[0]=nums[0]是顯而易見的,因為能拿且僅能拿這乙個,dp[1]則是在兩者中選擇乙個。

public

introb

(int

nums)

return dp[dp.length-1]

;}

考慮邊界條件

public

introb

(int

nums)

if(nums.length==1)

int[

] dp=

newint

[nums.length]

; dp[0]

=nums[0]

; dp[1]

=math.

max(nums[0]

,nums[1]

);if(nums.length==2)

for(

int i=

2;i)return dp[dp.length-1]

;}

leetcode演算法練習 打家劫舍

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

2020 02 04 演算法學習記錄 打家劫舍

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

打家劫舍系列DP之打家劫舍II

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