509. 斐波那契數
題目鏈接:509. 斐波那契數 - 力扣(LeetCode)
文章講解:代碼隨想錄
視頻講解:手把手帶你入門動態規劃 | LeetCode:509.斐波那契數_嗶哩嗶哩_bilibili
思路:輸入:2??輸出:1??解釋:F(2) = F(1) + F(0) = 1 + 0 = 1
動規五部曲:
1.確定dp數組以及下標的含義
dp[i]的定義為:第i個數的斐波那契數值是dp[i]
2.確定遞推公式
dp[i] = dp[i - 1] + dp[i - 2];
3.dp數組初始化
dp[0] = 0;??dp[1] = 1;
4.確定遍歷順序
dp[i]是依賴 dp[i - 1] 和 dp[i - 2],遍歷的順序一定是從前到后遍歷的
5.舉例推導dp數組
按照遞推公式dp[i] = dp[i - 1] + dp[i - 2],當N=10時:0 1 1 2 3 5 8 13 21 34 55
如果代碼結果不對,就把dp數組打印出來看看和推導的數列是不是一致的
時間復雜度:O(n)???空間復雜度:O(n)
70. 爬樓梯
題目鏈接:???????70. 爬樓梯 - 力扣(LeetCode)
文章講解:???????代碼隨想錄
視頻講解:帶你學透動態規劃-爬樓梯(對應力扣70.爬樓梯)| 動態規劃經典入門題目_嗶哩嗶哩_bilibili
思路:輸入:n = 3?????輸出:3
解釋:有三種方法可以爬到樓頂。1 階 + 1 階 + 1 階,1 階 + 2 階,2 階 + 1 階
定義一個一維數組來記錄不同樓層的狀態
1.確定dp數組以及下標的含義
dp[i]: 爬到第i層樓梯,有dp[i]種方法
2.確定遞推公式
dp[i] 可以有兩個方向推出來:一個是dp[i-1]再往上走一個臺階,一個是dp[i-2]再往上走2個臺階。dp[i - 1],上i-1層樓梯,有dp[i - 1]種方法,還有就是dp[i - 2],上i-2層樓梯,有dp[i - 2]種方法,dp[i]是兩種方法之和,所以dp[i] = dp[i - 1] + dp[i - 2]
3.dp數組初始化
dp[1] = 1,dp[2] = 2,然后從i = 3開始遞推
4.確定遍歷順序
從遞推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍歷順序一定是從前向后遍歷的
5.舉例推導dp數組
舉例當n為5的時候,dp table(dp數組)應該是:1 2 3 5 8,如果代碼出問題了,就把dp table 打印出來
時間復雜度:O(n)?????空間復雜度:O(n)
746. 使用最小花費爬樓梯
題目鏈接:746. 使用最小花費爬樓梯 - 力扣(LeetCode)
文章講解:???????代碼隨想錄
視頻講解:動態規劃開更了!| LeetCode:746. 使用最小花費爬樓梯_嗶哩嗶哩_bilibili
思路:
輸入:cost = [10, 15, 20]????輸出:15???解釋:最低花費是從 cost[1] 開始,然后走兩步即可到階梯頂,一共花費 15
使用動態規劃,就要有一個數組來記錄狀態,本題只需要一個一維數組dp[i]就可以了
1.確定dp數組以及下標的含義
dp[i]的定義:到達第i臺階所花費的最少體力為dp[i]。
2.確定遞推公式
可以有兩個途徑得到dp[i],一個是dp[i-1] 一個是dp[i-2]。cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用
dp[i - 1] 跳到 dp[i] 需要花費 dp[i - 1] + cost[i - 1],dp[i - 2] 跳到 dp[i] 需要花費 dp[i - 2] + cost[i - 2]。
選從dp[i - 1]跳還是從dp[i - 2]跳?一定是選最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
3.dp數組初始化
dp[0] = 0,dp[1] = 0;
4.確定遍歷順序
從前到后遍歷cost數組
5.舉例推導dp數組
示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,來模擬一下dp數組的狀態變化,如下:0 0 1 2 2 3 3 4 4 5 6
時間復雜度:O(n)??????空間復雜度:O(n)