動態規劃從入門到精通(一) 入門篇

2021-08-19 04:29:53 字數 3071 閱讀 2890

大三的春招,由於自己的不足,過得十分艱難。在各大公司的筆試題中,動態規劃是乙個必考點。突然冒出乙個想法,寫乙個「動態規劃從入門到精通」系列,與各大網友一起交流學習。

學習動態規劃,愚認為,就是解決以下的三個問題:

什麼是動態規劃?什麼時候要用動態規劃?怎麼使用動態規劃?

讓我們乙個乙個來解決!

1、什麼是動態規劃?的數學方法。把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。

2、什麼時候要用動態規劃?

如果要求乙個問題的最優解(通常是最大值或者最小值),而且該問題能夠分解成若干個子問題,並且小問題之間也存在重疊的子問題,則考慮採用動態規劃。

3、怎麼使用動態規劃?

我把下面稱為動態規劃五部曲:

1. 判題題意是否為找出乙個問題的最優解

2. 從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題

3. 從下往上分析問題 ,找出這些問題之間的關聯(狀態轉移方程)

4. 討論底層的邊界問題

5. 解決問題(通常使用陣列進行迭代求出最優解)

紙上得來終覺淺,絕知此事要躬行。舉幾個例子:

例子1:

劍指offer(第二版)面試題14:剪繩子

給你一根長度為n的繩子,請把繩子剪成m段 (m和n都是整數,n>1並且m>1)每段繩子的長度記為k[0],k[1],…,k[m].請問k[0]k[1]…*k[m]可能的最大乘積是多少?

例如,當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18.

看完題目,我們按照上面提到的「動態規劃五部」解決問題

1、判題題意是否為找出乙個問題的最優解

看到字眼是「可能的最大乘積是多少」,判斷是求最優解問題,可以用動態規劃解決;

2、從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題

題目中舉了個例子:當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18;我們可以從這裡開始突破,把長度為8繩子的最大乘積分解為數個子問題,長度為8我們可以把它看成長度為1和7的繩子的和,或者長度 為2和6的繩子的和,或者長度為3和5的繩子的和and so on!

到這裡,相信大家已經看到一絲真理了吧?

3. 從下往上分析問題 ,找出這些問題之間的關聯(狀態轉移方程)

在第二點時,我們已經從上到下分析問題了,現在我們要從下往上分析問題了。分析可知,

f(8) 的值就是f(1)*f(7),f(2)*f(6),f(3)*f(5),f(4)*f(4)它們之中的最小值,即f(8) = max

只要知道f(1)到f(7)的值就能求出f(8);對於f(7),只要知道f(1)到f(6)的值就能求出f(6);對於f(6),只要知道f(1)到f(5)的值就能求出f(6);以些類推,我們只要知道前幾個邊界的值,就能一步步迭代出後續的結果!

狀態轉移方程: f(n)=max i=

4. 討論底層的邊界問題

底層的邊界問題說的就是最小的前幾個數值的f(n)的值,本題中就是f(0)、f(1)、f(2)、f(3)的值

對於f(0),長度為0的繩子,沒辦法剪,沒有意義

對於f(1),長度為1的繩子,沒辦法剪,設為1

對於f(2),長度為2的繩子,只有一種剪法,剪成兩段長度為1的繩子,但剪後的乘積為1,比自身更小;如果不是求自身的值,要求乘積最大值的話就沒必要剪。

對於f(3),長度為3的繩子,只有一種剪法,剪成兩段長度為1和2的繩子,但剪後的乘積為2,比自身更小;如果不是求自身的值,要求乘積最大值的話也沒必要剪。

5、解決問題

這一部就是寫**了

public

static

intcutting(int n)

value[i] = max;

}max = value[n];

return max;

}

對於剛學習動態規劃的同學,看完上面那題會有點吃力吧?那我們再來一題簡單的,給大家增加信心!

例子2:

跳台階問題

乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個n級台階總共有多少種跳法。

1、判題題意是否為找出乙個問題的最優解

這個我還真的看不出,直覺判斷這題可以通過動態規劃迭代出來….有經驗的網友可以分享下看法,指導一下本小白白。

2、從上往下分析問題,大問題可以分解為子問題,子問題中還有更小的子問題

題目中沒有給粟子,我們可以自己舉點粟子。例如,跳上乙個6級台階台階,有多少種跳法;由於青蛙一次可以跳兩階,也可以跳一階,所以我們可以分成兩個情況

1、青蛙最後一次跳了兩階,問題變成了「跳上乙個4級台階台階,有多少種跳法」

2、青蛙最後一次跳了一階,問題變成了「跳上乙個5級台階台階,有多少種跳法」

由上可得f(6) = f(5) + f(4);

由此類推,f(4)=f(3) +f(2)

3.、從下往上分析問題 ,找出這些問題之間的關聯(狀態轉移方程)

跟上面的例題一相同,可以由f(1)逐漸迭代上去

由2可得,狀態轉移方程為:f(n)=f(n-1)+f(n-2)

4、邊界情況分析

跳一階時,只有一種跳法,所以f(1)=1

跳兩階時,有兩種跳法,直接跳2階,兩次每次跳1階,所以f(2)=2

跳兩階以上可以分解成上面的情況

5、解決問題

public

static

intjump(int n)

return

value[n];

}

《劍指offer(第二版)》(何海濤著)

動態規劃入門篇

動態規劃相信大家都知道,動態規劃演算法也是新手在剛接觸演算法設計時很苦惱的問題,有時候覺得難以理解,但是真正理解之後,就會覺得動態規劃其實並沒有想象中那麼難。在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個最大和即可...

DDD從入門到精通 基礎篇

這篇文章主要還是表述清楚ddd相關的基礎概念,因為ddd入門有一定的專業名詞,還是得有個基本的了解。先講解下領域模型作用 對軟體需求進行設計,維持其內在邏輯的一致性 1 劃分邊界 也是一種高內聚 低耦合 2 所有邏輯都是內聚在物件內部的 包含行為和資料 為什麼需要ddd?行業現狀 貧血模型 充血模型...

Zabbix從入門到精通(一)

zabbix可以說是乙個非常優秀的開源網管系統,即使是現在的很多大廠商使用的還是zabbix做監控,或者針對zabbix進行二次開發。需要詳細了解zabbix的可以去它的官網去了解,這裡就不多說了。zabbix,本文主要介紹怎麼快速搭建zabbix,這裡主要介紹部署包安裝zabbix,也是最簡單的一...