動態規劃的思路說起來很簡單,但是新遇到乙個題目往往就會卡殼,甚至出現解不出來的情況。因此學習的過程中,有必要對面試準備中涉及到的動態規劃題目記錄,這裡只談思路,不涉及具體實現。
通過分析不僅可以總結思路,更重要的是能從這些問題中找出動態規劃題目求解的共性,希望徹底搞定動態規劃!。
動態規劃常用來解決優化問題,與遞迴分治的思想相似但又不完全相同。動態規劃通過找出問題的「最優子結構」,然後組合子問題的解求得最優解,核心思想是通過**或陣列記住已經求過的解(這部分是與遞迴最大的不同)。
一般求解流程:
假設最優子結構
在假設的基礎上對子問題進行切分定義狀態轉移方程
組合子問題的解(這部分涉及到需要儲存解的資料結構構建)
雖然只有4步,但幾乎個個都是難點:
如何正確的切分問題
子問題之間的狀態轉移方程根據狀態轉移方程如何進行解的結合
正是這些難點才使得這方面的題目不好解決,在接下來的總結中,重點從這些方面對題目進行思路分析。
亞洲微軟研究院所在的希格瑪大廈一共有6部電梯。在高峰時間,每層都有人上下,電梯每層都停。實習生小飛常常會被每層都停的電梯弄的很不耐煩,於是他提出了這樣乙個辦法:
由於樓層並不算太高,那麼在繁忙的上下班時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客從一樓上電梯,到達某層後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則計算出應停的樓層。
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
分析最優化問題,假設有n個乘客,電梯共有n層,所有乘客爬樓梯層數之和為ans。
拍腦門演算法
從1到n層,求當電梯停在i層時,總結乘客爬樓梯層數之和為ans[i], 那麼最終的答案則是這些結果中的最小值,為min(ans[1…n])。這種方法時間複雜度為o(n
2)
o(n^2)
o(n2
),不可取,不過倒給我們提供了一種思路,「按照電梯層數對問題進行切分」
動態規劃分析
假設電梯在第i
ii層停止,對應乘客爬樓梯層數之和最少為y
yy同時假設第i−1
i-1i−
1層及以下的乘客數n1n1
n1,第i層下的乘客數為n2n2
n2,第i +1
i+1i+
1層及以上下的乘客數為i+1
i+1i+
1。那麼在這些假設前提下:
當電梯在第i-1層停止時,對應乘客爬樓梯層數之和最少為y−n
1+n2
+n
3y-n1 +n2 + n3
y−n1+n
2+n3
,因為低於i層的乘客少爬樓梯,高於i層的乘客需要多爬樓梯,其和相當於人數,同理可得以下:
當電梯在第i+1層停止時,對應乘客爬樓梯層數之和最少為y+n
1+n2
−n
3y+n1+n2-n3
y+n1+n
2−n3
分析到這裡,問題的解法就可以出來了,從1到n層電梯,用ans = 0儲存最優解,對每層判斷n1+
n2
n1+n2
n1+n2與n3n3
n3的大小,當n1+
n2
n1+n2 < n3 n1+n 2時,y +n 1+n2 −n 3> yy+n1+n2-n3 > y y+n1+n 2−n3 > y ,說明i+1層才是最優解,繼續遍歷,否則最優解為y yy, 退出。 覆盤總結解題思路: 假設最優子結構:通過假設最優解,得到子問題的表示式。 子問題切分:電梯層數 狀態轉移方程:判別式n1+ n2 n1+n2 < n3 n1+n 2,僅成立時繼續遍歷。 組合解:乙個變數ans儲存即可。 問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1.我們設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 11揹包問題。資料 物... 給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。請確認你是否能夠跳躍到陣列的最後乙個下標。例如 a 2,3,1,1,4 a 2,3 1,1 4 能夠跳躍到最後乙個下標,輸出true a 3,2,1,0,4 a 3,2 1,0 4 不能跳躍到... 使用乙個二維陣列 val i j 存放當前容量下的最大價值,其中第 i 行表示可選物品中加入 第 i 個物品,j 為當前揹包的假設容量,val i j 表示假設當前的揹包的最大容量為 j 在可選的物品中加入第 i 個物品後,揹包能裝入的物品的最大價值,val i j 值的選取方法如下 初始化第 0 ...演算法之一動態規劃
跳躍遊戲一(動態規劃)
演算法(一) 動態規劃法