你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
"""# 1.dp[i] 代表當前最大子序和
# 2.動態方程: dp[i] = max(dp[i-1], nums[i-1]+dp[i-2]),即max(最後乙個房子不偷, 最後乙個房子偷)
# 3.初始化: 給沒有房子時,dp乙個位置,即:dp[0]
# 3.1 當n=0時,沒有房子,dp[0]=0;
# 3.2 當n=1時,有一間房子,偷即可:dp[1]=nums[0]
n = len(nums)
if n == 0:
return 0
dp = [0] * (n+1) # 開闢n+1空間,[0, n]
dp[0] = 0 # 沒有房子
dp[1] = nums[0] # 一棟房子
for i in range(2, n+1):
dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])
return dp[n]
nums = [3, 1, 2, 4] # 7
s = solution()
print(s.rob(nums))
陣列滾動寫法
198 打家劫舍
很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...