演算法思想 動態規劃

2021-09-23 06:10:58 字數 1590 閱讀 6486

我所理解的動態規劃,其本質是對遞迴的優化。所以一般需要先找出其遞迴方式,才能進一步地優化。但是,只要刷題數量達到了一定程度,就會隱約感覺到有乙個解題模板,只需要按照這個模板去比對各種條件就可以解題。

狀態,動態規劃都會使用到輔助陣列來記錄問題的解,這些陣列的下標具有重要作用,一定要弄明白下標究竟表示哪種狀態的解。

轉移方程,其本質是遞迴方程

初始化,不同的問題要採用不同的初始化方式

狀態

輔助陣列一般有三種:一維陣列,二維陣列和三維陣列。首先要明確使用幾維的輔助陣列作為解的記錄,然後要弄清楚陣列的下標表示什麼,尤其是二維陣列的下標,其含義可以千變萬化。

1.單序列問題,採用一維陣列

2.一維的代價,採用二維陣列

3.二維的代價,採用三維陣列

轉移方程

轉移方程與狀態的聯絡非常緊密,

單序列問題指的是使用乙個一維陣列(假設該陣列名為dp)作為問題解(假設原問題的陣列名為input)的記錄,那麼dp[i]的狀態就一般表示為以當前元素作為結尾時的最優解。其狀態轉移方程分為以下幾種情況:

dp[i]只與dp[i-1]有關,即該狀態只與前乙個狀態相關

dp[i]與dp[0],dp[1]…dp[i-1]有關或者部分有關(很多時候可能是dp[i-j]和dp[j]),即該狀態需要搜尋前面全部已知狀態,然後選取乙個最優值

所謂一維的費用,指的是每個物品具有一種費用,選擇這個物品時只需要付出一種費用,譬如硬幣問題,

所謂二維的費用,指的是每個物品具有兩種不同的費用,選擇這個物品時必須同時付出兩種費用,譬如01組合問題,費用增加了一維,只需要狀態也增加一維,設dp[i,v,u]表示前i個物品付出兩種費用分別為v和u時可獲得的最大價值。

1.確認這是乙個什麼型別的問題,是單序列問題,還是揹包問題

2.如果是單序列問題

2.1當前狀態的狀態轉移方程是怎樣的:是只與前乙個狀態有關,還是要在前面的所有狀態之間挑選乙個最優值

2.2初始化狀態是怎樣的:當只有乙個元素的時候,解是怎樣的

3.如果是揹包問題

針對單序列問題,我採用的解題流程包括以下幾步:

針對揹包問題,我所採用的解題流程包括以下幾步:

1.這是乙個什麼型別的揹包問題:

0/1揹包 (每個物品只能選取一次) - 逆序迴圈

完全揹包(每個物品可以重複選取) - 順序迴圈

多重揹包 - 拆分物品

2.初始化該怎麼設定

求揹包價值的最大值,最小值

要求恰好裝滿揹包 -

初始化時除了dp[0]為0,其他dp[1…v]均設定為負無窮,這樣就可以保證最終得到的dp[v]是一種恰好裝滿揹包的最優解

沒有要求恰好裝滿揹包,初始化時將dp[0…v]全部設定為0 求數量的最大值,最小值

最小值,dp[0]設定為0,dp[1…v]設定為v+1

最大值,dp[0…v]設定為0 題目型別歸類 組合問題-硬幣問題

**: programming/

演算法思想 動態規劃

2.舉例 揹包問題。有n件物品和容量為c的揹包,給出物品的重量及價值,求解怎樣選擇物品才能使裝入揹包的物品重量不超過揹包容量且價值最大?3.c語言實現 上述揹包問題中,每一件物品只能選擇裝入揹包和不裝入揹包,不能選擇裝入多次,也不能裝入物品的一部分,所以此問題為0 1揹包問題。include 準備工...

揹包dp的核心思想(動態規劃)

突然發現我一直沒有真正理解揹包,真正的揹包應該是用空間換時間的一種dp方法,本質上就是n個物品選或不選,理論上有2 n2 n 2n種可能結果,但是揹包利用的就是值域很小這一特點來重疊子結構,所以揹包本質上處理的應該是乙個集合中的所有物品,選或不選對應權值的變化。有時候這樣的權值甚至是多維度的,我們進...

動態規劃 思想

動態規劃 把問題劃分成子問題遞迴求解,並且保留中間結果以避免重複計算子問題的方法,叫動態規劃。eg 三角形路徑數字之和 關鍵思想 1,劃分成若干子問題 2,子問題的狀態,及若干狀態值 狀態的表述。3,子狀態之間的轉換 即遞迴求解,子狀態到上一級子狀態之間的變換關係 即如何從乙個或多個值已知的狀態,求...