題目[198]:打家劫舍 。
與題目 按摩師 一模一樣。
狀態定義:dp1[i]
表示選擇第 i 個時的最大收益;dp0[i]
表示不選擇第 i 個時的最大收益。
轉移方程:
// 不選擇第 i 個,前乙個可選可不選
dp0[i] = max(dp1[i-1], dp0[i-1])
// 選擇第 i 個,前乙個必然不能選
dp1[i] = dp0[i-1] + vals[i]
空間優化:
dp0 = max(dp1, dp0)
dp1 = dp0 + val[i]
**:
int rob1(vector&vals)
return max(dp0, dp1);
}
題目[213]:打家劫舍 ii 。
此處的附加條件是:房屋呈環形排列,第 0 號房屋與第 n-1 號房屋相鄰(不能同時偷它們)。也就是說:
也就是說,基於第一題的實現,此處答案是max(rob1(vals[0, ..., n-2]), rob1(vals[1, ..., n-1]))
.
可能你還有乙個疑問:假如第 0 號和第 n-1 號都不選才是最大的呢?
實際上,rob1(0, n-2)
已經考慮了這種情況,此處的rob1
只是在該區間內的最大收益,並不一定是選擇第 0 號房屋。rob1(1, n-1)
同理。
**:
class solution
int rob1(vector&vals, int start, int end)
return max(dp0, dp1);
}};
題目[337]:打家劫舍 iii 。
傳說中的「樹形dp」今天是終於遇上了
LeetCode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...