解題思路:
先畫樹形結構去分析,【x,n】表示考慮從x到n範圍內去偷盜,memo[x,n]表示x到n範圍內偷盜金額的最大值。
def rob_198(nums):
if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums[0], nums[1])
memo = [-1 for m in range(len(nums))]
memo[0] = nums[0]
memo[1] = max(nums[0],nums[1])
for i in range(2,len(nums)):
memo[i] = max(nums[i]+memo[i-2],memo[i-1])
print(memo[-1])
return memo[-1]
解題思路:213在前一道題的基礎上分別討論第乙個到n-1個商鋪的最大值和第二個到n個商鋪的最大值,最後取最大值即可。
def rob_213(nums):
""":type nums: list[int]
:rtype: int
"""if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums[0], nums[1])
memo = [-1 for m in range(len(nums))]
memo[0] = nums[0]
memo[1] = max(nums[0],nums[1])
for i in range(2,len(nums)-1):
memo[i] = max(nums[i]+memo[i-2],memo[i-1])
res_1 = memo[-2]
print(memo)
memo = [-1 for m in range(len(nums))]
memo[1] = nums[1]
for i in range(2,len(nums)):
if i == 2:
memo[i] = max(nums[i] + 0, memo[i - 1])
else:
memo[i] = max(nums[i]+memo[i-2],memo[i-1])
res_2 = memo[-1]
print(memo)
print(res_1,res_2)
print(max(res_1,res_2))
return max(res_1,res_2)
打家劫舍問題 LeetCode198 213
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
20190907 (leetcode習題)打家劫舍
遞迴思路 從第乙個開始偷,第n個房子處偷得的最大的總錢數要麼是第n 1個房子處偷得的總錢數,要麼是第n 2個房子處偷的總錢數 當前房子存放的錢數。class solution if result index 0 第index個房子處偷得的最大的總錢數要麼是上乙個房子處取得的最大的總錢數,要麼是上上乙...
LeetCode 803 打磚塊 困難
題目 803.打磚塊 有乙個 m x n 的二元網格,其中 1 表示磚塊,0 表示空白。磚塊 穩定 不會掉落 的前提是 一塊磚直接連線到網格的頂部,或者 至少有一塊相鄰 4 個方向之一 磚塊 穩定 不會掉落時 給你乙個陣列 hits 這是需要依次消除磚塊的位置。每當消除 hits i rowi,co...