這節課通過講解動態規划在文本對齊(Text Justification)和黑傑克(Blackjack)上的求解過程,來幫助我們理解動態規划的通用求解的五個步驟:
動態規划求解的五個“簡單”步驟:
- 定義子問題;
- 猜部分解決方法;
- 關聯子問題的解決方法;
- 遞歸&記錄 或者 構建自下向上的動態規划表;
- 解決原問題。
拿上節課的例子(斐波那契數和最短路徑)來看,如下圖所示:
一、文本對齊
首先,我們先看下文本對齊問題,在使用word排版文字的時候,為了排版美觀,我們常會用到文本兩端對齊的功能。文本對齊功能就是將文本拆分成合適的行,讓行內盡可能塞進足夠的詞。微軟MS OFFICE是用貪心算法做的,而Latex是用動態規划算法去做,效率會更高些。在解決文本對齊問題時,我們要定義它的對齊代價,即如果拆分后的文本近似與行寬,則它們的badness近乎於0,但如果不合適,則無窮。如下圖所示:
現在,我們用上面講的五步求解步驟來分析下:
- 子問題:自第i個word后的文本后綴words[i:](子問題數量為n);
- 猜:從哪開始第2行(猜的選擇小於等於n-i,即不超過后綴words[i:]的長度);
- 遞歸;
- 拓撲次序:從后往前去安排words;(補充:對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊<u,v>∈E(G),則u在線性序列中出現在v之前。通常,這樣的線性序列稱為滿足拓撲次序(Topological Order)的序列,簡稱拓撲序列。)
- 原問題:求起始位置的動態規划。
在上面的過程中會用到父指針,用於記住哪個猜的是最好的,這樣下一個猜測可以直接基於上一個最好的猜測進行。
二、黑傑克
黑傑克是一個賭場游戲,如果看過《決勝21點》的話,電影里面的21點撲克玩法就是黑傑克。游戲者的目標是使手中的牌的點數之和不超過 21 點且盡量大。在要牌的過程中,如果所有的牌加起來超過21點,玩家就輸了——叫爆掉(Burst)。假如他沒爆掉,那么你就與他比點數大小,大為贏。拿牌叫HIT,停牌(不再拿牌)叫STAND。玩家叫player,庄家叫dealer。
在黑傑克中的動態規划求解五步為上圖所示,這里不做詳細解釋,因為游戲規則我也不是很懂,后續有空再了解進行補充。