面試準備(一) 動態規劃

2021-09-12 23:38:26 字數 2259 閱讀 2434

動態規劃的思路說起來很簡單,但是新遇到乙個題目往往就會卡殼,甚至出現解不出來的情況。因此學習的過程中,有必要對面試準備中涉及到的動態規劃題目記錄,這裡只談思路,不涉及具體實現。

通過分析不僅可以總結思路,更重要的是能從這些問題中找出動態規劃題目求解的共性,希望徹底搞定動態規劃!。

動態規劃常用來解決優化問題,與遞迴分治的思想相似但又不完全相同。動態規劃通過找出問題的「最優子結構」,然後組合子問題的解求得最優解,核心思想是通過**或陣列記住已經求過的解(這部分是與遞迴最大的不同)。

一般求解流程:

假設最優子結構

在假設的基礎上對子問題進行切分定義狀態轉移方程

組合子問題的解(這部分涉及到需要儲存解的資料結構構建)

雖然只有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 ...