動態規劃學習篇

2021-08-20 15:21:36 字數 1824 閱讀 5477

最近在看牛客網的校招題目,發現很多公司的程式設計題都考了動態規劃裡面的知識,所以,專門抽個時間來學習一下。

首先,要用動態規劃演算法,得滿足以下幾個條件:

1.最優化原理(最優子結構性質) 最優化原理可這樣闡述:乙個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,乙個最優化策略的子策略總是最優的。乙個問題滿足最優化原理又稱其具有最優子結構性質。

2.無後效性將各階段按照一定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。換句話說,每個狀態都是過去歷史的乙個完整總結。這就是無後向性,又稱為無後效性。

演算法。動態規劃的思想是什麼:

記憶,空間換時間,不重複求解,由交疊子問題從較小問題解逐步決策,構造較大問題的解。

一般來說,乙個經典的動態規劃演算法時自底向上的(從較小問題的解,由交疊性質,逐步決策處較大問題的解),它需要解出給定問題的所有較小子問題。動態規劃的

乙個變種是試圖避免對不必要的子問題求解。如果採用自頂向下的遞迴來解,那麼就避免了不必要子問題的求解(相對於動態規劃表現出優勢),然而遞迴又會導致對

同乙個子問題多次求解(相

對於動態規劃表現出劣勢),所以將遞迴和動態規劃結合起來,就可以設計一種

基於記憶功能的從頂向下的動態規劃演算法

,在後面會

講。計算二項式係數:

在排列組合裡面,我們有下面的式子:

這個式子將c(n , k)的計算問題

表述為了

(問題描述

)c(n-1 , k -1)和c(n -1, k)兩個

較小的交疊子問題

。初始條件

:c(n , n) = c(n , 0) = 1

我們可以用

下列填矩陣

的方式求出c

該演算法的時間複雜度是多少呢?可以大概的估計下,

只填了下三角矩陣,為n*k/2  =  

n*k,具體

的次數為:

按行來填矩陣:演算法偽**:

第1個for是控制行的,要填到第n行。第2個for來控制每行填到哪的,到i和k的較小值。從這2個for也可以看出複雜度是n*k。

實現:

/*計算二項式係數*/

public class main

public static int binomial(int n,int k)

}return result[n][k];

}public static int min(int i,int k)

}

結果:

動態規劃與分治法:

相同點是動態規劃和分治法都劃分為了較小規模問題的解,

不同點是動態規劃的較小子問題是交疊的,而且要儲存較小子問題的解。

最有子結構和多階段決策

:最優子結構:有準確的定義,可以參見一些資料,我自己描述下就是:在動態規劃求解過程中的,子問題產生的解對於子問題來說也是乙個最優解

多階段決策:一步步的決策,無後效性,決策只依賴於當前狀態,不依賴於之前的狀態。

動態規劃總結篇

對於同一型別問題的總結 leetcode 516.最長回文子串行 給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 乙個可能的最長回文子串行為 bb class solut...

動態規劃答疑篇

1 到底什麼才叫 最優子結構 和動態規劃什麼關係。2 為什麼動態規劃遍歷dp陣列的方式五花八門,有的正著遍歷,有的倒著遍歷,有的斜著遍歷。目錄 最優子結構 是某些問題的一種特定性質,並不是動態規劃問題專有的。也就是說,很多問題其實都具有最優子結構,只是其中大部分不具有重疊子問題,所以我們不把它們歸為...

演算法學習 動態規劃基礎篇

動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 管理科學 電腦科學 經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。動態規劃背後...