動態規劃演算法經典問題 爬樓梯

2021-10-18 12:50:59 字數 2370 閱讀 4994

我們用動態規劃方法解決日常生活中經常遇到的乙個問題—爬樓梯問題。

一、問題描述

小明家住在二樓,每次回家都需要經過乙個10層台階的樓梯,小明每次可以選擇一步走一級台階或者一步走兩級台階。請幫小明計算他從樓下到家一共有多少種走法?

打個比方,小明可以選擇每次都走一級台階,那麼他回家一共需要走十步,這是其中的一種種走法,不然,他還可以選擇一次走兩級台階,那麼他回家一共需要走五步,這是另外一種走法,除此之外,還有很多種不同的走法,現在我們要做的是把所有可能的走法數量統計出來。

在正式寫程式之前,我們先一起整理一下該問題的解題思路。

首先考慮小明走最後一步的情況,他要麼是從第九級台階再走一級到第十級,要麼是從第八級台階走兩級到十級,如下圖圖一所示,也就是說,要想到達第十級台階,最後一步一定是從第八級或者第九級台階開始的。

也就是說,如果已知從地面到第八級台階一共有x種走法,從地面到第九級台階,一共有y種走法,那麼從地面走到第十級台階一定是x和y之和。

為了描述方便,用f(n)表示第n級台階的走法數量,根據以上分析,可以得到f(10)=f(9)+f(8)。以此類推,對於f(n),我們可以通過f(n-1)和f(n-2)計算得到,即f(n)=f(n-1)+f(n-2)。

當問題繼續細化,即只有一級和兩級台階時,我們可以直接得出結論,無需繼續細化,即f(1)=1,f(2)=2。如下圖圖二所示,為到達第二級台階的走法示例。

分析到這裡,該問題作為動態規劃問題求解的三個要素,就全部出現了,如下所示:

邊界:f(1)=1,f(2)=2。

最優子結構:f(n)的最優子結構即f(n-1)和f(n-2)。

狀態轉移函式:f(n)=f(n-1)+f(n-2)。

至此,爬樓梯問題的動態規劃建模過程已經完成。

考慮到演算法的時間和空間的效率問題,為了避免重複計算子問題的解,我們利用最優子結構特性,採用自底向上的方式進行計算,具體過程如下所述。

根據邊界定義,我們已經知道前兩級台階的走法數量,如表一所示。

表一中第一行表示樓梯的台階數量,第二行中對應的各列表示針對各級台階可能的走法數量,在後續的求解過程中,我們可以利用**中已知的子問題的解,根據狀態轉移函式,獲得新的階段的子問題的解,通過迭代,不斷將**填滿,從而得到該問題的最終解。

在第一次迭代過程中,台階數量為3,根據狀態轉移函式可知,f(3)=f(2)+f(1)=3,因此目前求解狀態如表二所示。

在第二次迭代過程中,台階數量為4,根據狀態轉移函式,可知f(4)=f(3)+f(2)=5,因此目前求解狀態如表三所示。

以此類推,經過八次迭代後,即可獲得第十級台階的走法數量,如表四所示。

總結上面的過程,對每一級樓梯的走法數量而言,其求解過程所依賴的都是其前一級和前兩級樓梯的走法數量。因此,在每一次迭代過程中,僅需要關注這兩個變數的取值。即可獲得所求的新的變數的值。

現在來把這個過程轉化為程式。

定義函式upstairs(n)來計算第n級台階的走法數量。在正式迭代之前,首先界定邊界的情況。當n小於1時,說明該輸入變數不合法,返回的走法數量為0;當n為1時,即為第一種邊界的情況,返回值為1;當n為2時,即為第二種邊界的情況,返回值為2。

之後即進入迴圈的迭代過程,在迭代中,根據之前的分析,僅需要關注n-1和n- 2的取值,即可通過狀態轉移函式f(n)=f(n-1)+f(n-2)獲得f(n)的值,因此,整個迭代過程僅需要引入乙個臨時變數迴圈儲存當前子問題的解即可。

由此可見,該解決方案的時間複雜度為o(n),而空間複雜度為o(1)。

二、最終**

爬樓問題的動態規劃求解的程式如下圖圖三所示。

首先定義邊界值,確定f(1)和f(2)的取值。之後,通過函式upstairs(n)迭代計算到達各層的樓梯走法數量並輸出,最終獲得問題的解。

動態規劃演算法經典案例

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

爬樓梯問題 動態規劃

題目 乙個人每次只能走一層樓梯或者兩層樓梯,問走到第80層樓梯一共有多少種方法。解題思想 設走第i層樓梯需要dp i 中方法,走第i 1層樓梯需要dp i 1 中方法。則走第 i 1層樓梯的方法種數為dp i 1 dp i 種。實動態規劃解題的主要思想就是找出遞推式,然後利用子問題的解來求最後的最優...

動態規劃(爬樓梯問題)

問題 有 n 階台階,每次可以走 1 或 2 步,請問走到第 n 階台階一共有多少種走法?解 設有 f n 種走法 第一步 1 2 第二步 f n 1 f n 2 狀態方程 f n f n 1 f n 2 n 2 f 0 0,f 1 1,f 2 2 函式 int function int n int...