動態規劃演算法經典例題 動態規劃的經典模型

2021-10-18 02:00:11 字數 2150 閱讀 9607

動態規劃演算法的核心就是記住已經解決過的子問題的解。

記住求解的方式有兩種:①自頂向下的備忘錄法自底向上。

線性模型的是動態規劃中最常用的模型,上文講到的鋼條切割問題就是經典的線性模型,這裡的線性指的是狀態的排布是呈線性的。【例題1】是乙個經典的面試題,我們將它作為線性模型的敲門磚。

【例題1】在乙個夜黑風高的晚上,有n(n <= 50)個小朋友在橋的這邊,現在他們需要過橋,但是由於橋很窄,每次只允許不大於兩人通過,他們只有乙個手電筒,所以每次過橋的兩個人需要把手電筒帶回來,i號小朋友過橋的時間為t[i],兩個人過橋的總時間為二者中時間長者。問所有小朋友過橋的總時間最短是多少。

來看一組資料 四個人過橋花費的時間分別為 1 2 5 10,按照上面的公式答案是19,但是實際答案應該是17。

具體步驟是這樣的:

第一步:1和2過去,花費時間2,然後1回來(花費時間1);

第二歩:3和4過去,花費時間10,然後2回來(花費時間2);

第三部:1和2過去,花費時間2,總耗時17。

所以之前的貪心想法是不對的。我們先將所有人按花費時間遞增進行排序,假設前i個人過河花費的最少時間為opt[i],那麼考慮前i-1個人過河的情況,即河這邊還有1個人,河那邊有i-1個人,並且這時候手電筒肯定在對岸,所以opt[i] = opt[i-1] + a[1] + a[i] (讓花費時間最少的人把手電筒送過來,然後和第i個人一起過河)如果河這邊還有兩個人,乙個是第i號,另外乙個無所謂,河那邊有i-2個人,並且手電筒肯定在對岸,所以opt[i] = opt[i-2] + a[1] + a[i] + 2*a[2] (讓花費時間最少的人把電筒送過來,然後第i個人和另外乙個人一起過河,由於花費時間最少的人在這邊,所以下一次送手電筒過來的一定是花費次少的,送過來後花費最少的和花費次少的一起過河,解決問題)

所以 opt[i] = min

區間模型的狀態表示一般為d[i][j],表示區間[i, j]上的最優解,然後通過狀態轉移計算出[i+1, j]或者[i, j+1]上的最優解,逐步擴大區間的範圍,最終求得[1, len]的最優解。

【例題2】給定乙個長度為n(n <= 1000)的字串a,求插入最少多少個字元使得它變成乙個回文串。

典型的區間模型,回文串擁有很明顯的子結構特徵,即當字串x是乙個回文串時,在x兩邊各新增乙個字元』a』後,axa仍然是乙個回文串,我們用d[i][j]來表示a[i…j]這個子串變成回文串所需要新增的最少的字元數,那麼對於a[i] == a[j]的情況,很明顯有 d[i][j] = d[i+1][j-1] (這裡需要明確一點,當i+1 > j-1時也是有意義的,它代表的是空串,空串也是乙個回文串,所以這種情況下d[i+1][j-1] = 0);當a[i] != a[j]時,我們將它變成更小的子問題求解,我們有兩種決策:

1、在a[j]後面新增乙個字元a[i];

2、在a[i]前面新增乙個字元a[j];

根據兩種決策列出狀態轉移方程為:

d[i][j] = min + 1;(每次狀態轉移,區間長度增加1)

空間複雜度o(n^2),時間複雜度o(n^2), 下文會提到將空間複雜度降為o(n)的優化演算法。

揹包問題是動態規劃中乙個最典型的問題之一。由於網上有非常詳盡的揹包講解,這裡只將常用部分抽出來。

【例題3】有n種物品(每種物品1件)和乙個容量為v的揹包。放入第 i 種物品耗費的空間是ci,得到的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。f[i][v]表示前i種物品恰好放入乙個容量為v的揹包可以獲得的最大價值。決策為第i個物品在前i-1個物品放置完畢後,是選擇放還是不放,狀態轉移方程為:

f[i][v] = max

時間複雜度o(vn),空間複雜度o(vn) (空間複雜度可利用滾動陣列進行優化達到o(v) )。

本文出處:

演算法-動態規劃 dynamic programming--從菜鳥到老鳥​blog.csdn.net

動態規劃演算法經典案例

動態規劃演算法是從暴力搜尋演算法優化過來的,如果我們不清楚暴力搜尋的過程,就難以理解動態規劃的實現,當我們了解了動態規劃演算法的基本原理的文字概述,實現條件之後,這時可能並不是太理解這種思想,去面對實際問題的時候也是無從下手,這個時候我們不能停留在文字層面上,而應該去學習經典動態規劃演算法的實現,然...

動態規劃演算法例題

題目 有乙個序列 3,5,9,0,2,8,3,9,5,9,2,8 取其中不相鄰子串行,求可能的最大值是多少?思路 用動態規劃來求解。對於最後乙個元素,可以分成兩種情況,取還是不取。如果取,那麼我們在8的基礎上再加上前10個元素組成的序列求得的最大值,如果不取,那麼我們考慮前11個元素組成的序列即可。...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...