198.打家劫舍
問題:
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額
示例:
輸入:[1,2,3,1]
輸出:4
解釋:偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
輸入:[2,7,9,3,1]
輸出:12
解釋:偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接着偷竊 5 號房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12 。
解決:
思想:
這道題是一道典型的動態規劃問題,首先我們熟悉一下解決動態規劃的解決思路:
- 分析原問題與子問題
- 分析狀態
- 分析邊界狀態
- 分析狀態轉移方程
(對了,這裏注意一下題目,是沿街偷竊,所以不可能跳過某個房屋纔開始,這裏注意一下)
python代碼:
class Solution:
def rob(self, nums: List[int]) -> int:
n=len(nums)
if(n==1):
return nums[0]
if(n==2):
return max(nums[0:2])
dp=[None]*100
dp[0]=nums[1]
dp[1]=max(nums[0],nums[1])
for i in range(2,n):
dp[i]=max(dp[i-2]+nums[i],dp[i-1])
return dp[n-1]