動態規劃 由簡單到難

2022-04-23 06:09:11 字數 3469 閱讀 4555

爬樓梯問題

每次可以爬1或2個台階 爬到第10層有幾種辦法

climb = lambda x: climb(x-1) + climb(x-2) if x > 2 else x

另一種實現

```

def climb(n):

temp = [1, 2]

for i in range(3, n+1):

temp[i%2] = sum(temp)

return temp[n%2]

```

小偷

你是⼀個專業的⼩偷,計畫偷竊沿街的房屋。每間

素就是相鄰的房屋裝有相互連通的防盜系統,如果

動報警。

給定⼀個代表每個房屋存放⾦額的⾮負整數陣列,

最⾼⾦額。

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

輸出: 4

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

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

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

輸出: 12

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

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

答案

def rob(nums):

last, now = 0, 0

for i in nums: last, now = now, max(last + i, now)

return now

golang實現

package main

import "fmt"

func rob(nums int) int

last, now = now, tmp

}return now

}func main()))

fmt.println(rob(int))

}

數字字母匹配

題目: 有一種將字母編碼成數字的方式:'a'->1, 'b->2', ... , 'z->26'。現在給一串數字,給出有多少種可能的解碼結果

def num_decoding(s):

last, now = 1, int(s[0] != '0')

for i in range(1, len(s)):

last, now = now, last * (9 < int(s[i - 1:i + 1]) <= 26) + now * (int(s[i]) > 0)

return now

提示 要注意 0, 10, 101這種帶0的

青蛙過河普通版

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,……,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。

題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

def jump(s, t, l):

""":param s: s > 0

:param t: t > s

:param l: l 第乙個位置永遠是0 最後是終點

:return:

"""d =

d[0] = true

for k in l:

if d[k]:

for step in range(s, t+1):

if k+step in d:

d[k+step] = true

if k + step >= l[-1]:

return true

return false

print(jump(1, 2, [0, 2, 3, 5]))

print(jump(1, 2, [0, 2, 3, 6]))

print(jump(1, 2, [0, 3, 4, 5]))

print(jump(1, 3, [0, 2, 3, 6]))

青蛙過河最終版

題目:乙隻青蛙想要過河。 假定河流被等分為 x 個單元格,並且在每乙個單元格內都有可能放有一石子(也有可能沒有)。 青蛙可以跳上石頭,但是不可以跳入水中。

給定石子的位置列表(用單元格序號公升序表示), 請判定青蛙能否成功過河(即能否在最後一步跳至最後乙個石子上)。 開始時, 青蛙預設已站在第乙個石子上,並可以假定它第一步只能跳躍乙個單位(即只能從單元格1跳至單元格2)。

如果青蛙上一步跳躍了 k 個單位,那麼它接下來的跳躍距離只能選擇為 k - 1、k 或 k + 1個單位。 另請注意,青蛙只能向前方(終點的方向)跳躍。

請注意:

石子的數量 ≥ 2 且 < 1100;

每乙個石子的位置序號都是乙個非負整數,且其 < 231;

第乙個石子的位置永遠是0。

思路:在動態規劃方法中,我們會利用雜湊表 mapmap,對於雜湊表中的 key:valuekey:value,keykey 表示當前石頭的位置,valuevalue 是乙個包含 jumpsizejumpsize 的集合,其中每個 jumpsizejumpsize 代表可以通過大小為 jumpysizejumpysize 的一跳到達當前位置。首先我們對雜湊表初始化,keykey 為所有石頭的位置,除了位置 0 對應的 valuevalue 為包含乙個值 0 的集合以外,其餘都初始化為空集。接下來,依次遍歷每個位置上的石頭。對於每個 currentpositioncurrentposition,遍歷 valuevalue 中每個 jumpsizejumpsize,判斷位置 currentposition + newjumpsizecurrentposition+newjumpsize 是否存在於 mapmap 中,對於每個 jumpsizejumpsize,newjumpsizenewjumpsize 分別為 jumpsize-1jumpsize−1,jumpsizejumpsize,jumpsize+1jumpsize+1。如果找到了,就在對應的 valuevalue 集合裡新增 newjumpsizenewjumpsize。重複這個過程直到結束。如果在結束的時候,最後乙個位置對應的集合非空,那也就意味著我們可以到達終點,如果還是空集那就意味著不能到達終點。

官方答案

public class solution 

map.get(0).add(0);

for (int i = 0; i < stones.length; i++) }}

}return map.get(stones[stones.length - 1]).size() > 0;

}}

poj 1015 動態規劃 難

這道題我是看別人的思路寫的,因為有個絕對值,無法轉移狀態,自己傻得非要把絕對值表示出來,其實可以在計算完成後篩選,我這個菜鳥估計是受揹包的的影響,想狀態的時候還想著前幾個中選出多少個。這道題的狀態是f i j i選了的人數,邊界為零,目標為m,j為d p a 的差值和,f值為d p b 值。記如何狀...

美團 動態規劃(有點難理解)

給你六種面額1 5 10 20 50 100元的紙幣,假設每種幣值的數量都足夠多,編寫程式求組成n員 n為0 10000的非負整數 的不同組合的個數。輸入為乙個數字n,即需要拼湊的面額輸出也是乙個數字,為組成n的組合個數。示例1 5 2典型的動態規劃問題,狀態是總數為n時的可能性,用dp陣列表示,狀...

動態規劃由簡及繁(一)

輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。問題拆解 求連續子陣列的和的最大值。假設陣列長度為n。那麼如果知道前...