演算法 動態規劃3

2021-10-23 02:32:54 字數 3033 閱讀 3847

根據在演算法-動態規劃2裡提到的思路,讓我們來解決乙個組合問題 :leetcode 第77題。

給定2個整數n,k,求出從[1,…,n]中取k個數字的所有組合。

例如 n=4, k=2

就是從[1,2,3,4]中取2個數字的所有組合。

結果為:[[1, 2], [1, 3], [2, 3], [1, 4], [2, 4], [3, 4]]

(1)假設組合中不包含 第n個數字,原問題就變為:

求出從[1,…,n-1] 中取k個數字的所有組合。

(2)假設組合中包含 第n個數字,原問題就變成了:

求出從[1,…,n-1]中取 k-1 個數字的組合,然後中每個組合中,把第n個數字加進去。

(1)+ (2)就是問題的解。

import copy

class

solution

:def

combine

(self, n, k)

:return self.combine_core(n, k)

defcombine_core

(self, n, k)

:if n <=

0or k <=0:

return

list()

if k ==1:

return

[[i]

for i in

range(1

, n +1)

]# 第(1)種情況

res1 = self.combine_core(n -

1, k)

# 第(2)種情況

res2 = self.combine_core(n -

1, k -1)

# 把 第n個數字 加入(2)的結果中

for l in res2:

# (1)+(2)

res =

list()

if res1:

res.extend(res1)

if res2:

res.extend(res2)

return res

# main

s = solution(

)print

(s.combine(4,

2))

import copy

class

solution

:def

__init__

(self)

: self.memo =

list()

defcombine

(self, n, k)

: self.memo =[[

none

for j in

range

(k+1)]

for i in

range(0

, n+1)

]return self.combine_core(n, k)

defcombine_core

(self, n, k)

:if n <=

0or k <=0:

return

list()

if k ==1:

return

[[i]

for i in

range(1

, n +1)

]# 返回儲存的結果

if self.memo[n]

[k]is

notnone

:return self.memo[n]

[k] res1 = self.combine_core(n -

1, k)

res2 = self.combine_core(n -

1, k -1)

for l in res2:

res =

list()

if res1:

res.extend(res1)

if res2:

res.extend(res2)

# 儲存結果,因為python的list賦值是物件引用的賦值,這裡需要用深拷貝

self.memo[n]

[k]= copy.deepcopy(res)

return res

def

combine

(n, k)

: memo =[[

list()

for j in

range

(k +1)

]for i in

range(0

, n +1)

]for i in

range(1

, n+1)

: memo[i][1

]=[[v]

for v in

range(1

, i +1)

]for i in

range(1

, n+1)

:for j in

range(1

, k+1)

: res1 = memo[i -1]

[j] res2 = memo[i -1]

[j -1]

for l in res2:

ifnot memo[i]

[j]:

memo[i]

[j].extend(copy.deepcopy(res1)

) memo[i]

[j].extend(copy.deepcopy(res2)

)return memo[n]

[k]# main

print

(combine(4,

2))

注意:

這個動態規劃的解法,因為涉及到list的深拷貝,所以會比較耗時。在leetcode上當跑到(20,16)時,會因為耗時太長而通不過的。在前面提到的慕課網的課程裡,是通過回溯法來解決的。我在這裡,是借這個例子來實踐前面學習到的動態規劃的解題思路。

動態規劃(3)

robberies include include include includeusing namespace std 這題是參考的 自己的能力還是不可以。不過做了這題,再和0 1揹包問題想一想,覺得收穫還是不錯。說將逃跑率當成物品價值 小弟還是要繼續消化這條題的思想。double f 10020...

3動態規劃

此次專題主要講解動態規劃,題目大致分為兩類 一種是遞迴來解決,一種是0 1揹包問題。動態規劃就是把乙個問題分成多個階段來解決,並且每個階段都相互有所聯絡。其遵循最優性原理。1,不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。2,最優決策序列的子串行,一...

動態規劃 3

尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個來做,而其...