動態規劃學習筆記 一

2021-09-14 00:51:44 字數 2079 閱讀 3470

春秋招如同達摩克里斯之劍,逼著我又撿起來這些亂七八糟的演算法書。

這裡分享一些關於動態規劃的一些學習筆記。

動態規劃(dynamic programming)其實一開始是在優化理論出現的,他不是計算機裡的東西,但是他卻在計算機裡扮演了乙個非常重要的角色,是無論如何也繞不開的一種演算法。

回想一下,我們學過的很多演算法,其實都是應用條件給的非常詳細的,比如dijkstra演算法,要求你在乙個無負權無環路的無向圖上使用,最後返回乙個包含著最短路徑的頂點的陣列。又比如什麼快速排序,要求你有乙個陣列,以及定義在這個陣列上乙個大小關係,最後返回乙個排序好的陣列給你。

但是動態規劃實際上不是單單一種演算法,如果非要找個模擬物件,那麼動態規劃實際上就是跟「遞迴」,「分治演算法」,這兩個詞一樣,形容的是一大類演算法。

首先說一下什麼叫做最優化問題,口頭一點的話,最優化問題就是讓你求在給定條件下乙個函式的最大值最小值或者極值。乙個無負權無環路的無向圖,求某個點到某個點的最長,最短路徑,就是可以歸類成最優化問題。再舉個例子,求最長公共子串行。例如x=,y=則它們的lcs是和。

想要使用動態規劃,那麼問題就非得是乙個最優化問題不可。而且這還不夠,問題必須是適用於最優性原理的優化問題。而最優性原理,通俗一點,就是這個問題本身和他的子問題有遞推公式。和分治這種演算法不一樣的是,動態規劃主要用來決策。

有了遞推公式還不夠,拿fibonacci數列來說,如果你像下面這樣求解問題,那麼複雜度大概是o(2^n)

fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
fibonacci(n-1) 展開後的式子和 fibonacci(n-2)展開後的式子基本上都是重複計算,比方說我們展開等式右邊第乙個 fibonacci(n-1) = fibonacci(n-2) + fibonacci(n-3)。這裡出現乙個fibonacci(n-2) 但是原來的式子也有乙個fibonacci(n-2),這裡兩個fibonacci(n-2)在不知道對方存在的情況下會分別展開出一堆,明顯是重複計算了,所以我們現在想最好只算一次fibonacci(n-2)。

那麼怎麼辦呢,我們引入快取。然後改變一下計算的順序。

fibo[0] = 1

fibo[1] = 1

for (int i=2;i<=n;i++)

fibo[i] = fibo[i-1] + fibo[i-2];

我們把fibonacci計算出來的值存入乙個叫做fibo的陣列(快取)裡。然後改變了一下計算順序,我們原來是fibonacci(n)一直展開到fibonacci(1)然後再返回。現在我們先算fibonacci[2] 再算fibonacci[3]。 等等。

廢話了一堆,以上大概就是動態規劃的簡介。來看看例題吧。

我們現在有乙個數字三角形。每個位置有乙個數字,到達後即可獲得累加,求從最頂端到達最低層能達到的最大數字和。

這顯然是乙個最優化問題,關鍵在於,看不出這個問題能有什麼子問題,以及如果有子問題,那麼又和這個問題本身有什麼關係,適用不適用於最優性原理。這應該是解決動態問題最難的地方。找出遞推關係,或者叫做狀態轉移方程。

我們把最頂端的點設為(1,1),第二行第乙個叫做(2,1),以此類推。第i行第j個就叫做(i,j),往左下角走就(i+1,j) 右下角走就(i+1,j+1) 。

設dp[i][j] 為 從(i,j)到最低層走的最大值,那麼子問題就是dp[i+1][j] 和 dp[i+1][j+1]。我們現在要探索dp[i][j] 和 dp[i+1][j]以及dp[i+1][j+1]的關係。

不難得出dp[i][j] = max(dp[i+1][j] , dp[i+1][j+1]) + (i,j)上的值。

我們可以很輕鬆地得到如圖所示的最低層的dp值,dp[5][1] = 12 , dp[5][2] = 7,那麼dp [4][1] = max(dp[5][1] + dp[5][2] ) + val(i,j) = 12 + 6 = 18。

事實上還有很多題目看起來一點也不像是適用於最優性原理的優化問題,但是通過人為地引進狀態,可以變成動態規劃問題。比如dag上的動態規劃,就是乙個非常常用的動態規劃模型。

學習筆記 動態規劃

動態規劃 多階段決策 意義 求解決策過程最優化的數學方法 基本思想 將待求解的問題分為若干個階段,即若干個互相聯絡的子問題,在求解子問題的過程中逐步推導出原問題的解。核心 在求解子問題的過程中,儲存子問題的解。注1 動態規劃的思想實際上和遞迴相似。都是通過逐步推導,得到答案。而用它們解題時的核心也都...

學習筆記 動態規劃

bullet 先來看乙個問題 小張現在有8個任務可選,每個任務都必須在規定的時間段完成不能多也不能少,而且每個任務都有對應的報酬如下圖,問小張應如何選擇才能拿到最多的報酬?那我們換種方法來解決這個問題吧,首先,每個任務都有選和不選兩種選擇,我們從最後乙個任務開始模擬這個過程。首先我們需要先用乙個陣列...

動態規劃學習筆記

最近開始學習動態規劃演算法,我的理解是動態規劃演算法是乙個用空間換時間的演算法,常用在一些求最解 計數 判斷有無等問題中,且這些問題都存在大量重複的計算。動態規劃的思想就是將已經計算過的資料儲存起來,在下次用到時可以直接取用,這樣就消除了重複計算。而且這也是體現 動態 的地方,就是能根據之前情況進行...