動態規劃方法
1.分解為子問題
2.遞迴定義最優解的值
3.計算最優解,自底向上
4.選出最優解
以第二個示例為例,把最後乙個1去掉,剩下的最優解dp【i-1】,加上1之後就有兩種情況,nums[i] + dp[i-2]和 dp[i - 1]那個大哪個就是最終解,於是從dp開始把每個最優解存起來,最後選出最大值
自己的:
class
solution
(object):
defrob
(self, nums)
:"""
:type nums: list[int]
:rtype: int
"""length =
len(nums)
if length ==0:
return
0if length ==1:
return nums[0]
dp =
0])
max(nums[0]
, nums[1]
))for i in
range(2
, length)
:max
(nums[i]
+ dp[i-2]
, dp[i -1]
))return dp[-1
]
別人的:
class
solution
(object):
defrob
(self, nums)
:"""
:type nums: list[int]
:rtype: int
"""ifnot nums:
return0if
len(nums)
<2:
return nums[0]
dp =[0
]*len(nums)
dp[0]
= nums[0]
dp[1]
= nums[1]
for i in
xrange(2
,len
(nums)):
dp[i]
=max
(dp[
:i-1])
+ nums[i]
return
max(dp)
198 打家劫舍
很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...