演算法之動態規劃(爬樓梯與斐波那契數列)JS的實現

2021-10-09 11:30:48 字數 1524 閱讀 2193

什麼是動態規劃?

動態規劃(dynamic

programming,dp)是運籌學的乙個分支,是求解決策過程最優化的過程。20世紀50年代初,美國數學家貝爾曼(r.bellman)等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,從而創立了動態規劃。動態規劃的應用極其廣泛,包括工程技術、經濟、工業生產、軍事以及自動化控制等領域,並在揹包問題、生產經營問題、資金管理問題、資源分配問題、最短路徑問題和複雜系統可靠性問題等中取得了顯著的效果

爬樓梯題目描述

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是乙個正整數。

示例 1:

輸入: 2

輸出: 2

解釋: 有兩種方法可以爬到樓頂。

1 階 + 1 階

2 階

示例 2:

輸入: 3

輸出: 3

解釋: 有三種方法可以爬到樓頂。

1 階 + 1 階 + 1 階

1 階 + 2 階

2 階 + 1 階

分析:

假設樓梯有5階,

當第一步走一階時:

剩下的樓梯還有四階,那麼剩下的四階有幾種走法?

當一步走兩階時,

剩下的樓梯有三階,那麼剩下的三階有幾種走法?

問題的規模隨著拆分,會變得越來越小,這種將問題拆解,並通過計算小問題的解,最終計算出最優解的思想就是動態規劃。

假設走完x階樓梯有f(x)種走法,那麼根據上面的分析一共有這麼多的方法可以走完整個樓梯:

f(x) = f(x-1) + f(x-2);

當然我們要確定一下邊界值:

當我們走1階的時候:

dp[1] =1 ;

因為陣列的下標存在0,所以dp[0] =1

上面的通式用js實現:

let

allmethods

=function

(n)return dp[n]

}

此演算法的時間複雜度為o(n),空間複雜度為:o(n)。

那麼按照上述思想去求解斐波那契數列:

斐波那契數列:

斐波那契數列指的是這樣乙個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…

這個數列從第3項開始,每一項都等於前兩項之和。

function

dynfib

(n)if

(n ===

1|| n ===2)

else

}return fib[n-1]

}

利用動態規劃求解,是面對複雜問題的一種解決思路。

動態規劃(斐波那契系列) 爬樓梯

遞迴和動態規劃都是將原問題拆成多個子問題然後求解,他們之間最本質的區別是,動態規劃保留了子問題的解,避免了重複計算。70.climbing stairs easy 題目描述 有 n 階樓梯,每次可以上一階或者兩階,求有多少種上樓梯的方法。思路分析 定義乙個dp陣列儲存上樓梯的方法數,dp i 表示走...

斐波那契 70 爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2輸出 2解釋 有兩種方法可以爬到樓頂。1.1 階 1階 2.2 階 示例 2 輸入 3輸出 3解釋 有三種方法可以爬到樓頂。1.1 階 ...

Leetcode練習 十六 爬樓梯與斐波那契數列

you are climbing a stair case.it takes n steps to reach to the top.each time you can either climb 1 or 2 steps.in how many distinct ways can you climb...