動態規劃入門之小明課間爬台階

2021-08-07 13:58:36 字數 2583 閱讀 9079

從前有乙個很可愛的小學生叫做小明,小明平時最大的愛好就是思考問題。

有一天,小明走到了教學樓的台階前,小明心想:「來學校上學都有好幾天了,竟然沒有數過每一層有多少台階」,然後他就開始數了起來:

1、2、……

「一共有10個台階!」

數完了台階,小明開開心心地上台階了。可是小明邊上台階,他又邊思考呀:「我每次跨一步可以上一級台階,也可以上二級台階,再用力跨的話還可以上**台階。那麼我從最底下的地面走到最上層的10級台階,有多少方案數呢?」

這個問題引起了小明的思考,但是小明是乙個勤於思考的好學生,他絕對不會讓乙個問題難倒他的。

小明於是開始對這個問題進行全面的思考:

假設我現在站在台階前,我所在的地面是第0層台階,我可以到達的台階分別是第1、2、3、……、10層台階,那麼這個問題就變成了:

「請問從第0層台階開始,每次可以走1、2或3層台階,最終到達第10層台階的方案數有多少種?」

然後小明開始思考:

從第0層台階走到第0層台階的方案數一共有1種(因為小明現在就站在第0層台階上,所以它不需要懂就能到達第0層台階,也就是說只有1種方案)。

從第0層台階走到第1層台階的方案數一共有1種:

0 --> 1 (表示從第0層台階走到第1層台階,下同)

從第0層台階走到第2層台階的方案數一共有2種:

0 --> 2 (表示直接從第0層台階跨到了第2層台階)

0 --> 1 --> 2 (表示先從第0層台階跨到了第1層台階,再從第1層台階跨到了第2層台階)

從第0層台階走到第3層台階的方案數一共有4種:

0 --> 3

0 --> 2 --> 3

0 --> 1 --> 3

0 --> 1 --> 2 --> 3

從第0層台階走到第4層台階的方案數一共有7種:

0 --> 3 --> 4

0 --> 2 --> 3 --> 4

0 --> 1 --> 3 --> 4

0 --> 1 --> 2 --> 3 --> 4

0 --> 2 --> 4

0 --> 1 --> 2 --> 4

0 --> 1 --> 4

……小明非常仔細地列舉出了從第0層台階到第0、1、2、3、4層台階的所有方案數,但是當小明開始列舉從第0層台階到第5層台階的時候他戛然而止。「不行,這不是我理想種解決問題的方案。如果按照這種方案算到第10層,不僅容易漏掉方案導致算錯,還會花費大量時間,在課間十分鐘的時間內我是絕對算不完的!」

於此同時,小明也發現了方案數之間的規律。

假設f(i)表示小明從第0層台階走到第i層台階的方案數,那麼,可以得出下面的規律:

f(0) = 1

f(1) = f(0) = 1

f(2) = f(1) + f(0) = 1 + 1 = 2

而對於所有滿足3<=n<=10的n來說,可以得到:

f(n) = f(n-1) + f(n-2) + f(n-3)

於是,我們可以按照這個公式來得出解決方案如下:

f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) = 4 + 2 + 1 = 7

f(5) = f(4) + f(3) + f(2) = 7 + 4 + 2 = 13

f(6) = f(5) + f(4) + f(3) = 13 + 7 + 4 = 24

f(7) = f(6) + f(5) + f(4) = 24 + 13 + 7 = 44

f(8) = f(7) + f(6) + f(5) = 44 + 24 + 13 = 81

f(9) = f(8) + f(7) + f(6) = 81 + 44 + 24 = 149

f(10) = f(9) + f(8) + f(7) = 149 + 81 + 44 = 274

於是,小明在上課預備鈴想的那一刻,計算出了從第0層台階到第10層台階的方案數是274種,開開心心地去上課了。

趁小明去上課的時間,在這裡和大家簡要地闡述一下小明解決爬樓梯問題地演算法,那就是「動態規劃」了。

拿爬樓梯地問題來說,我們把到達某一層樓梯都設為一種狀態,用f(i)來表示從第0層台階爬到第i層台階地方案數,那麼我們可以發現,f(i)和f(i-1)、f(i-2)以及f(i-3)都是有聯絡的,進一步推敲他們之間的關係,我們便可以得出下面的公式:

f(n) = f(n-1) + f(n-2) + f(n-3)

像這樣的公式我們一般把它叫做「狀態轉移方程」,而像這種一般可以用狀態轉移方程進行求解問題的方法我們就把它們稱為「動態規劃」了。

現在,你是不是對動態規劃有了乙個大致的了解了呢:)

求解上述問題的c++**:

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...