初聞動態規劃

2021-08-20 09:42:44 字數 2303 閱讀 5422

本文以一道常見的演算法面試題開篇,引入動態規劃的基礎概念, 介紹其思考過程。

有乙個樓梯總共n個台階,只能往上走,每次只能上1個、2個台階,總共有多少種走法。

解決方案

1、排列組合;

列舉2的個數,再列舉2具體放的位置;

計算複雜,容易遺漏。

2、動態規劃;

dp[n] 表示n個台階的走法,那麼有:

dp[n]=dp[n-1]+dp[n-2];

思路清晰,**簡單。

1、動態規劃;

動態規劃(dynamic programming)指的是解最優化問題的一種方法。

2、最優子結構性質;

問題的最優解可以分解為若干子問題,且子問題的解也是最優的;

以上台階為例,到第i層的最多走法,可以分解為第i-1層和第i-2層的走法之和,且第i-1層和第i-2層的走法也是最多的;

3、 無後效性;

現階段的決策不會影響未來的決策;

以上台階為例,走到第i-2層的最多走法,不會因為增加第i-1層而改變;

動態規劃的思考過程可以總結為:大事化小,小事化了

大事化小

乙個較大的問題,通過找到與子問題的重疊,把複雜的問題劃分為多個小問題,也稱為狀態轉移;

小事化了

小問題的解決通常是通過初始化,直接計算結果得到;

具體的步驟

1、將大問題分解為子問題

2、確定狀態表示

3、確定狀態轉移

4、考慮初始狀態和邊界情況

有如圖所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

解決思路

1、大事化小。要到達第i層,先要到達第i-1層。並且第i層的第j個節點,只能由i-1層的第j個和第j-1個節點到達。

我們用dp[i][j]表示,走到第i層第j個位置的數字最大和。

那麼有dp[i][j]=max(dp[i-1][j], dp[i-1][j-1]) + a[i][j];

2、小事化了。第1層的第1個節點,初始值為dp[1][1]=a[1][1]。(a[x][y]表示第x層,第y個的值)

平面上有n*m個格仔,每個格仔中放著一定數量的蘋果。

你從左上角的格仔開始,每一步只能向下走或是向右走,每次走到乙個格仔上就把格仔裡的蘋果收集起來。這樣下去,你最多能收集到多少個蘋果。

解決思路

1、只能向右走或者向下走,要到達第i行第j列的格仔的時候,可以由第i-1行第j列或者第i行第j-1列到達,我們用dp[i][j]表示,走到第i行第j列的最多蘋果數,那麼有:

dp[i][j]=max(dp[i-1][j], dp[i][j-1]) + a[i][j];

2、第1行第1列,初始值為dp[1][1]=a[1][1],注意事項是邊界條件的處理。

給定n件物品和乙個容量為m的揹包,每件物品都會消耗揹包的一定容積c[i],並帶來一定價值v[i],要求如何選取裝入揹包中的物品,使得揹包內的物品價值最大。

解決思路

把n件物品放入揹包,可以分解為「將前i件物品放入容量為m的揹包中」問題。

若只考慮第i件物品的選擇,那麼問題可以分為兩種情況:

1、如果不放第i件物品,問題就轉化為「前i-1件物品放入容量為v的揹包中」;

2、如果放第i件物品,問題就轉化為「前i-1件物品放入剩下的容量為m-c[i]的揹包中」;

我們用f[i][j]表示前i個物品,放入容量為j的揹包的最大價值,上面的兩種情況可以表示為

f[i][j] = max(f[i-1][j], f[i-1][j-c[i]]+v[i]);

初始化條件memset(dp, 0, sizeof(dp));和dp[1][c[1]]=v[1]。

最後遍歷f[n][1~m]可以得到最大值。

如果還不能完全理解01揹包,那麼還需要再仔細理解最優子結構、狀態表示和狀態轉移。

演算法能擴充套件思考方向,完善思維能力。學會「上台階」、「數塔」、「01揹包」這三個題目,能解決演算法面試的動態規劃部分。

程式設計師演算法基礎——動態規劃

面試初入演算法(九) 動態規劃

將乙個複雜的問題拆分為重複的子問題,確保每乙個問題都是最優解,從而得出全域性最優解,用遞迴的方式,常用的動態規劃會要求求最大值,最少的方法等。分治 遞迴 動態規劃 貪心演算法區別 看部落格 動態規劃的關鍵點 最優子結構 儲存中間狀態 得出dp公式 現在以乙個簡單的題進入,從而了解什麼是動態規劃 斐波...

初入演算法篇(動態規劃)書架問題2

題意 將n本書按高度由小到大排序,然後求出書架的不整齊度。不整齊度 每兩本書寬度的差的絕對值的和 如有4本書 1 2 5 3 2 4 3 1 排序後 1 2 2 4 3 1 5 3 不整齊度就是2 3 2 7,求出去掉k本書後最小不整齊度 題解 逆向思維,求出n k本書的最小不整齊度即可 轉移方程為...

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...