動態規劃(三)

2021-08-19 20:23:28 字數 1612 閱讀 1927

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例1:

輸入: [1,2,3,1]

輸出: 4

解釋: 偷竊 1 號房屋 (金額 =1) ,然後偷竊 3 號房屋 (金額 = 3)。

偷竊到的最高金額 = 1 + 3 = 4 。

示例2:

輸入: [2,7,9,3,1]

輸出: 12

解釋: 偷竊 1 號房屋 (金額 =2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。

偷竊到的最高金額 = = 2 + 9 + 1 = 12 。

求解遞迴公式:

f

(0) = nums[0]

f(1) = max

(num[0], num[1])

f(k) = max

( f(k-2) + nums[k], f(k-1) )

**:

class

solution:

defrob

(self, nums):

last, now = 0, 0

for i in nums:

last, now = now, max(last + i, now)

return now

另乙個版本:

class

solution1:

defrob

(self, nums):

""" :type nums: list[int]

:rtype: int

"""if len(nums) == 0: return

0if len(nums) < 2: return max(nums)

nums[1] = max(nums[0], nums[1])

for i in range(2, len(nums)):

nums[i] = max(nums[i - 1], nums[i] + nums[i - 2])

return max(nums)

class

solution:

defrob

(self, nums):

""" :type nums: list[int]

:rtype: int

"""odd_sum = 0

even_sum = 0

for i in range(len(nums)):

if i%2 == 0:

even_sum = max(even_sum+nums[i],odd_sum)

else:

odd_sum = max(odd_sum+nums[i],even_sum)

return max(odd_sum,even_sum)

動態規劃(三)

一 dag上的dp 當題目給定了一張有向無環圖 dag 或原問題可以抽象成乙個dag時,可以在dag上進行dp來求解問題 dag最短路 給定乙個城市的地圖,所有的道路都是單行道,而且不會構成環。每條道路都有過路費,問您從s點到t點花費的最少費用。f x 表示從s出發到達x的最少費用 f x min ...

動態規劃的思考(三)

from sicp 第一章 1.2.2 樹形遞迴中,有這麼一問題 給了半美元,四分之一美元,10美分,5美分和1美分的硬幣,將1美元換成零錢,一共有多少種不同方式?更一般的問題是,給定了任意數量的現金,我們能寫乙個程式,計算出所有換零錢方式的種數嗎?動態規劃 dynamic programming,...

三道動態規劃題

三道簡單的動態規劃題 有 m x n 個格仔,機械人在最左上角的格仔,星星在最右下角的格仔。機械人只能向左和向下走。問 機械人拿到星星,總共有多少種拿法?如下圖 思路 問題其實就是從左上角走到右下角,有多少種走法。如果倒過來看,站在右下角的角度,走到右下角,只有2種可能 一是從右下角格仔的左邊走來 ...