代碼隨想錄算法訓練營第三十二天|動態規劃理論基礎、LeetCode 509. 斐波那契數、70. 爬樓梯、746. 使用最小花費爬樓梯

目錄

LeetCode 509. 斐波那契數

70. 爬樓梯

746. 使用最小花費爬樓梯

感想


文檔講解:代碼隨想錄

動態規劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動態規劃是最有效的。

所以動態規劃每一個狀態一定是由上一個狀態推導出來的這一點就區別于貪心,貪心沒有狀態推導,而是從局部直接選最優的。

解題步驟:

  1. 確定dp數組(dp table)以及下標的含義

  2. 確定遞推公式

  3. dp數組如何初始化

  4. 確定遍歷順序

  5. 舉例推導dp數組

為什么要先確定遞推公式,然后在考慮初始化呢?因為一些情況是遞推公式決定了dp數組要如何初始化

做動規的題目,寫代碼之前一定要把狀態轉移在dp數組上的具體情況模擬一遍,心中有數,確定最后推出的是想要的結果。然后再寫代碼,如果代碼沒通過就打印dp數組,看看是不是和自己預先推導的哪里不一樣。

題目類型有基礎題目、背包問題、打家劫舍、股票問題、子序列問題 五大類

LeetCode 509. 斐波那契數

文檔講解:代碼隨想錄

視頻講解:手把手帶你入門動態規劃 | LeetCode:509.斐波那契數_嗶哩嗶哩_bilibili

狀態:簡單題,做對了,要注意特殊情況的處理,怎么返回

class Solution:def fib(self, n: int) -> int:if n == 0: # 邊界條件return 0if n == 1:return 1dp = [0]*(n+1) # step1:dp數組 dp[i]是第i個斐波那契數的值dp[1] = 1 # step3:dp數組初始化for i in range(2, n+1): # step4:因為要用到前面的狀態,所以遍歷順序從前向后dp[i] = dp[i-1] + dp[i-2] # step2:遞推公式/狀態轉移方程return dp[n]

時間復雜度O(n)

空間復雜度O(n)

當前狀態dp[i]只依賴前面兩個狀態dp[i-1]和dp[i-2],所以可以不用維護一整個數組,而是3個量就可以了,得到上面程序的精簡版:

class Solution:def fib(self, n: int) -> int:if n <= 1:return ndp = [0]*2dp[1] = 1for i in range(2, n+1):sum = dp[0] + dp[1]dp[0] = dp[1]dp[1] = sumreturn dp[1]

?時間復雜度O(n)

空間復雜度O(1)

70. 爬樓梯

文檔講解:代碼隨想錄

視頻講解:

狀態:去年7月11日做過,一周年了,結果還是不會做。 想dp數組的定義,想了好久,不確定到底該怎么定義,到底是第i走了幾個臺階 or 一共走了多少臺階 or 剩下多少臺階,但最后需要返回的是方法數量,這該咋辦呢?

我的錯誤思路:

        # dp[i]是走完第i個臺階后,一共走了多少臺階# 遞推公式 dp[i] = dp[i-1] + 1或2dp = [0] * n # 每次都走一個臺階,最多n步dp[0] = 1  # 但也有可能是2?if dp[-1] < n:  # 該確定遍歷順序了,怎么遍歷?dp

正確思路是直接考慮每層樓梯的方法數目:

爬到第一層樓梯有一種方法,爬到二層樓梯有兩種方法。

那么第一層樓梯再跨兩步就到第三層 ,第二層樓梯再跨一步就到第三層。

所以到第三層樓梯的狀態可以由第二層樓梯 和 到第一層樓梯狀態推導出來。

動規五部曲:

1. 一維數組?dp[i]: 爬到第i層樓梯,有dp[i]種方法

2.?遞推公式:考慮最后一步走幾個臺階,有兩種情況1或者2。上i-1層樓梯,有dp[i - 1]種方法,那么再跳一個臺階就是dp[i];上i-2層樓梯,有dp[i - 2]種方法,那么再一步跳兩個臺階就是dp[i]。 所以爬到第i層樓梯,有dp[i] =?dp[i - 1] + dp[i - 2] 種方法。

3. 初始化:從dp數組定義的角度出發,不用考慮dp[0]的初始化,直接dp[1] = 1,dp[2] = 2,然后從i = 3開始遞推

4. 從前向后遍歷

5.?舉例推導dp數組? ? 1? 2? 3? 5? 8? 13?

斐波那契數列:0、1、1、2、3、5、8、13、21、34……

與斐波那契數列后半截一樣的

class Solution:def climbStairs(self, n: int) -> int:if n == 1:return ndp = [0]*(n+1) # 因為python下標從0開始,到n 長度為n+1dp[1] = 1dp[2] = 2for i in range(3,n+1):dp[i] = dp[i-1] + dp[i-2]return dp[n]

注意!一定要注意邊界條件的處理!如果不寫 if n==1: return n 的話,當n = 1時,dp[2] = 2 處就會報錯list out of range。

空間和時間復雜度:O(n)? 此題也可以像上一題一樣優化空間復雜度為O(1)

拓展:這道題目還可以繼續深化,就是一步一個臺階,兩個臺階,三個臺階,直到 m個臺階,有多少種方法爬到n階樓頂。這其實是一個完全背包問題,后面會講。

746. 使用最小花費爬樓梯

文檔講解:代碼隨想錄

視頻講解:

狀態:自己做對了!類比上一題。

動規五部曲:

定義:dp[i]是到達第i個臺階需要支付的最少費用

公式:dp[i] = min((dp[i-1] + cost[i-1]), dp[i-2] + cost[i-2])

初始化:dp[0] = 0? ?dp[1]?= 0? ? ? ?題目中說 “你可以選擇從下標為 0 或下標為 1 的臺階開始爬樓梯” 也就是相當于 跳到 下標 0 或者 下標 1 是不花費體力的

順序:從前向后

舉例:

cost = [1,100,1,1,1,100,1,1,100,1]

下標? ? ? ? ? 0? ? 1? ? 2? ? 3? ? 4? ? 5? ? 6? ? 7? ? 8? ? 9? ?樓頂

dp數組? ? ? 0? ? ?0? ?1? ? 2? ?2? ? 3? ? 3? ? 4? ? ?4? ? 5? ? 6? ? ?確定dp數組長度為len(cost)+1

class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:dp = [0]*(len(cost)+1)dp[0] = 0dp[1] = 0for i in range(2,len(cost)+1): # 從2開始推導dp[i] = min((dp[i-1] + cost[i-1]), dp[i-2] + cost[i-2])return dp[-1]

感想

學習用時:晚上2h + 晚上2h

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89505.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMVC3

一、JSON 與參數傳遞1.1JSON 是什么- JSON 是字符串&#xff1a;比如 {"name":"zhangsan","password":"123456","age":15} 就是一個 JSON 字符串&#xff0c;它用來在前后端、服務間傳遞數據。- JSON 庫&#xff1a;Fastj…

查看.bin二進制文件的方式(HxD十六進制編輯器的安裝)

文章目錄Windows 系統上安裝 HxD 十六進制編輯器的步驟。**HxD 是一款免費、輕量級的工具&#xff0c;適合查看和編輯 .bin 等二進制文件。****PS:實際安裝過程中會發現找不到Windows11的版本&#xff0c;安裝windows10的即可&#xff0c;并且沒有區別setup版和portable版**安裝…

Linux系統性能優化與監控

系統性能優化與監控是保障 Linux 服務器穩定運行的核心技術&#xff0c;涉及 ??CPU、內存、磁盤 I/O、網絡、進程?? 等多維度的指標分析、問題定位與優化策略。以下從??監控工具與指標??、??常見問題診斷??、??優化方法??三個層面詳細講解&#xff0c;并結合?…

如何在 React + TypeScript 中實現 JSON 格式化功能

如何在 React TypeScript 中實現 JSON 格式化功能 作為前端開發者&#xff0c;我們經常需要處理 JSON 數據。無論是 API 調試、配置文件編輯還是數據轉換&#xff0c;能夠格式化 JSON 是一項基本但非常有用的技能。本文將詳細介紹如何在 React 和 TypeScript 環境中實現 JSON…

Mac連接服務器Docker容器全攻略

蘋果電腦( macOS 系統 )連接服務器、配置容器,整體思路和 Linux 終端操作更貼近,以下結合 macOS 特點,詳細分步說明,以 Docker 容器 + 常見 Linux 服務器( 如 CentOS、Ubuntu )為例: 一、連接服務器(SSH 方式, macOS 終端原生支持 ) 1. 準備信息 找運維或云平臺…

【字節跳動】數據挖掘面試題0019:帶貨直播間推薦:現在有一個帶貨的直播間,怎么把它精準地推送給有需要的用戶

文章大綱 帶貨直播間推薦系統:原理、算法與實踐 一、推薦系統在帶貨直播中的重要性 二、數據收集與處理 1. 用戶數據 2. 直播間數據 3. 用戶行為數據 4. 數據處理與特征工程 三、推薦算法實現 1. 基于內容的推薦 2. 基于協同過濾的推薦 3. 基于知識圖譜的推薦 4. 混合推薦算法…

Windows10筆記本電腦開啟BIOS

文章目錄什么是BIOS一、方案一&#xff1a;快捷鍵進入二、方案二&#xff08;推薦&#xff09;各品牌快捷鍵大全什么是BIOS BIOS 全拼為 BasicInputOutputSystem, 即基本輸入/輸出系統,是計算機中非常基礎而且重要的程序。把這一段程序存放在一個不需要電源的記憶體(芯片)中,就…

NFS、iSCSI 和lnmp部署操作

目錄 &#xff08;一&#xff09;基礎配置 1.NFS服務安裝 2.修改配置文件 3.重載配置文件 4.查看共享目錄 5.客戶端掛載 6.更換共享目錄 7.基礎實驗 &#xff08;二&#xff09;布置lnmp平臺 1.php 安裝軟件 檢測 2.連接MySQL 測試 3.軟件實施 軟件安裝配置 &…

Redis深度解析:從緩存原理到高并發實戰

第一部分&#xff1a;Redis核心概念與架構設計1.1 Redis本質解析Redis&#xff08;Remote Dictionary Server&#xff09;作為開源的內存數據結構存儲系統&#xff0c;其核心價值在于&#xff1a;內存優先架構&#xff1a;數據主要存儲在內存中&#xff0c;讀寫性能達到10萬 QP…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博類別信息爬取

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解架構搭建 視頻在線地址&#xff1a; 2026…

GD32/STM32嵌入CMSIS-DSP的庫(基于Keil)

當你要用到三角函數、開方、矩陣運算等復雜的數學運算時&#xff0c;可以選擇用C庫的math.h里面的函數&#xff0c;如果要求速度快的話就得用CMSIS-DSP庫里面的函數了&#xff0c;因為CMSIS-DSP庫充分運用了CM4內核的浮點運算單元&#xff08;若有&#xff09;和DSP相關的指令&…

頁面登錄阻止瀏覽器提醒是否保存密碼

一、原因 使用input的type"password"類型&#xff0c;瀏覽器會提醒是否記住密碼。 二、解決 取消type"password" 三、實現輸入密碼*代替 通過input輸入框&#xff0c;監聽輸入值&#xff0c;進行替換成*符號&#xff0c;避免使用input的type"password…

【iOS】dyld加載流程——應用程序的加載

目錄 前言 編譯過程與動靜態庫 編譯過程 動靜態庫 dyld &#x1f4cc; 什么是 dyld&#xff1f; dyld_shared_cache: dyld加載流程 _dyld_start dyldbootstrap::start dyld::main() 配置環境變量 共享緩存 主程序的初始化 插入動態庫 link主程序 link動態庫 弱…

從零開始,手把手教你本地部署Stable Diffusion AI繪畫(Win最新版)

本號之前有發過一篇win平臺的教程&#xff0c;由于是去年10月發布的&#xff0c;而Al繪畫技術發展很快&#xff0c;那篇教程已經有些不適用了&#xff0c;有些同學執行到第二步就出錯了。 應廣大同學的期望&#xff0c;我更新一版新版詳細教程。 一、前言 1.為什么要本地部署…

day21 力扣669. 修剪二叉搜索樹 力扣108.將有序數組轉換為二叉搜索樹 力扣538.把二叉搜索樹轉換為累加樹

修剪二叉搜索樹 給你二叉搜索樹的根節點 root &#xff0c;同時給定最小邊界low 和最大邊界 high。通過修剪二叉搜索樹&#xff0c;使得所有節點的值在[low, high]中。修剪樹 不應該 改變保留在樹中的元素的相對結構 (即&#xff0c;如果沒有被移除&#xff0c;原有的父代子代關…

《設計模式之禪》筆記摘錄 - 7.中介者模式

中介者模式的定義中介者模式的定義為&#xff1a;Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently…

Flutter:上傳圖片,選擇相機或相冊:wechat_assets_picker

圖片選擇功能&#xff1a;可選單張&#xff0c;或多張。 1、showModalBottomSheet&#xff08;選擇相冊/相機&#xff09; 2、WechatImagePicker&#xff08;選取圖片&#xff09; 3、CompressMediaFile&#xff08;圖片壓縮&#xff09;1、ActionSheetUtilimport package:duca…

pytest--0

1 pytest 使用方式 pytest測試框架-- 基本功能使用詳解 2 pytest-mock常用方式 pytest–1–pytest-mock常用的方法 3

multiprocessing.Pool 中的 pickle 詳解

前言&#xff1a; 在 Python 的 multiprocessing.Pool 中&#xff0c;任務和數據需要通過序列化&#xff08;pickle&#xff09;傳遞給子進程。pickle 是 Python 的內置序列化模塊&#xff0c;用于將 Python 對象轉換為字節流&#xff0c;以便在進程間通信時傳遞。然而&#xf…

Java集合框架體系詳解:List/Set/Map接口對比與核心實現原理

一、集合框架核心接口對比 1.1 List/Set/Map接口特性接口類型特性描述典型實現List有序可重復&#xff0c;支持索引訪問ArrayList/LinkedListSet無序不可重復&#xff0c;基于哈希表或樹實現HashSet/TreeSetMap鍵值對存儲&#xff0c;鍵唯一值可重復HashMap/TreeMap核心差異&am…