面試算法高頻08-動態規劃-01

動態規劃

遞歸知識要點

  1. 遞歸代碼模板:提供遞歸代碼的標準形式public void recur(int level, int param) ,包含終止條件(if (level> MAX_LEVEL))、當前層邏輯處理(process(level, param))、向下一層遞歸(recur(level: level +1, newParam))以及狀態恢復(未完整代碼呈現,但為重要環節),強調對該模板的記憶有助于構建遞歸算法邏輯。
  2. 遞歸狀態樹:遞歸狀態樹展示了問題逐步分解為子問題再求解的層級結構,直觀呈現遞歸過程中各子問題間的關系,輔助理解遞歸算法的執行流程與問題處理機制。
  3. 人肉遞歸的問題及解決思路:人肉遞歸存在效率低、易出錯的問題,人腦記憶的局限性使得在處理多層遞歸(如第三、四層)時難度加大。解決方法是尋找最近最簡的方法,將問題拆解為可重復解決的子問題,運用數學歸納法思維,挖掘問題中的重復性,轉化為計算機指令解決,避免過度依賴人肉遞歸。

動態規劃知識要點

  1. 定義:動態規劃是一種數學優化方法和計算機編程方法,由Richard Bellman在20世紀50年代提出。其核心是通過遞歸方式把復雜問題分解為簡單子問題來簡化求解過程,具有“分治 + 最優子結構”的特點,在多個領域廣泛應用。
  2. 與遞歸、分治的關系:動態規劃與遞歸、分治既有共性又有差異。共性在于都要找出重復子問題;差異在于動態規劃具有最優子結構,并且在求解過程中能夠淘汰次優解,從而提高算法效率,普通遞歸或分治可能不具備這些特性。
  3. 實例分析:以Fib(6)狀態樹為例,其中存在許多重復子狀態(如f(4)f(3)f(2)多次出現)。利用動態規劃淘汰次優解,可優化計算過程、避免重復計算,但可能使時間復雜度變為 n 2 n^2 n2,實際應用時需要權衡算法性能與復雜度。

題目練習

題目描述

使用動態規劃(Dynamic Programming)方法求解斐波那契數列(Fibonacci Sequence)的第 n 項。斐波那契數列的定義為:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2)(當 n ≥ 2 時)
分析思路
1. 動態規劃核心思想

斐波那契數列具有最優子結構重疊子問題,適合用動態規劃求解:

  • 最優子結構F(n)F(n-1)F(n-2) 唯一確定。
  • 重疊子問題:遞歸求解時,F(n-1)F(n-2) 會被重復計算(如計算 F(6) 時,F(4) 會被計算兩次)。動態規劃通過存儲中間結果避免重復計算,提升效率。
2. 狀態定義

定義 dp[i] 表示斐波那契數列的第 i 項的值。

3. 狀態轉移方程

根據斐波那契數列定義,狀態轉移方程為:
[ dp[i] = dp[i-1] + dp[i-2] ]
初始條件:

  • dp[0] = 0
  • dp[1] = 1
4. 空間優化

常規動態規劃需用數組存儲所有中間狀態(空間復雜度 O(n)),但由于 dp[i] 僅依賴前兩項 dp[i-1]dp[i-2],可通過兩個變量 prev1(存儲 F(n-2))和 prev2(存儲 F(n-1))迭代更新,將空間復雜度優化至 O(1)

最優解答(Python)
方法一:常規動態規劃(數組存儲中間狀態)
def fib(n: int) -> int:if n <= 1:return ndp = [0] * (n + 1)dp[0], dp[1] = 0, 1for i in range(2, n + 1):dp[i] = dp[i-1] + dp[i-2]return dp[n]
方法二:空間優化動態規劃(O(1) 空間)
def fib(n: int) -> int:if n <= 1:return nprev1, prev2 = 0, 1  # 對應 F(0) 和 F(1)for i in range(2, n + 1):current = prev1 + prev2  # 計算 F(i)prev1, prev2 = prev2, current  # 迭代更新前兩項return prev2  # 最終 prev2 存儲 F(n)
復雜度分析
  • 時間復雜度:兩種方法均為 O(n),每個狀態僅計算一次。
  • 空間復雜度
    • 方法一為 O(n)(存儲數組 dp)。
    • 方法二為 O(1)(僅用兩個變量迭代)。
關鍵點
  • 狀態轉移方程:明確子問題之間的關系,是動態規劃的核心。
  • 邊界條件:正確初始化 dp[0]dp[1],避免邏輯錯誤。
  • 空間優化:利用問題特性(僅依賴前兩項),減少內存占用,提升效率。
示例驗證

n = 6 時:

  • 常規方法:dp[2]=1, dp[3]=2, dp[4]=3, dp[5]=5, dp[6]=8,返回 8
  • 優化方法:通過迭代計算,最終 prev28,結果一致。

通過動態規劃,斐波那契數列的求解效率從遞歸的指數級(O(2^n))提升至線性級(O(n)),是重疊子問題和最優子結構的經典應用。

題目描述(課件中的路徑計數問題)

在一個 m×n 的網格 中,從左上角起點 (0, 0) 移動到右下角終點 (m-1, n-1),每次只能 向下(Row+1)或向右(Col+1) 移動一步。網格中某些單元格為 障礙物(非空地),若單元格 (i,j) 是障礙物,則無法通過。求從起點到終點的 路徑總數

網格路徑示意圖

在這里插入圖片描述

最優解答(Python)
def count_paths(grid: list[list[bool]]) -> int:m, n = len(grid), len(grid[0])dp = [[0] * n for _ in range(m)]dp[m-1][n-1] = 1 if not grid[m-1][n-1] else 0for i in range(m-1, -1, -1):for j in range(n-1, -1, -1):if i == m-1 and j == n-1:continueif grid[i][j]:dp[i][j] = 0continuedown = dp[i+1][j] if i+1 < m else 0right = dp[i][j+1] if j+1 < n else 0dp[i][j] = down + rightreturn dp[0][0]# 示例測試
if __name__ == "__main__":grid = [[False, False, False],[False, False, False],[False, False, False]]print(count_paths(grid))  # 輸出: 6
答案解析
1. 動態規劃核心思路(課件要點)
  • 狀態定義dp[i][j] 表示從 (i,j) 到終點的路徑數,障礙物單元格路徑數為 0
  • 狀態轉移dp[i][j] = dp[i+1][j] + dp[i][j+1](下方和右方路徑數之和),與課件中“累加關系”的狀態轉移方程一致。
  • 倒推計算:從終點向上、向左遞推,避免起點邊界特殊處理,符合課件中“從最下面依次往上”的思路。
2. 復雜度與關鍵點
  • 時間/空間復雜度均為 O(m×n),通過二維數組存儲中間狀態,確保每個單元格僅計算一次。
  • 障礙物判斷直接決定當前單元格路徑數是否為 0,是課件中“if a[i,j]=‘空地’”條件的代碼實現。

該解答結合課件核心思想與圖片可視化,清晰呈現動態規劃在路徑計數問題中的應用。

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

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

相關文章

若依框架前后端分離版部署全流程詳解(本地+服務器+高級配置)

若依框架前后端分離版部署全流程詳解&#xff08;本地服務器高級配置&#xff09; 若依&#xff08;RuoYi&#xff09;作為一款基于SpringBoot和Vue的權限管理系統&#xff0c;憑借其模塊化設計和開箱即用的特性廣受開發者歡迎。本文將從本地部署、服務器部署、高級配置三個維…

醫療設備預測性維護合規架構:從法規遵循到技術實現的深度解析

在醫療行業數字化轉型加速推進的當下&#xff0c;醫療設備預測性維護已成為提升設備可用性、保障醫療安全的核心技術。然而&#xff0c;該技術的有效落地必須建立在嚴格的合規框架之上。醫療設備直接關乎患者生命健康&#xff0c;其維護過程涉及醫療法規、數據安全、質量管控等…

LLMs基礎學習(七)DeepSeek專題(4)

LLMs基礎學習&#xff08;七&#xff09;DeepSeek專題&#xff08;4&#xff09; 文章目錄 LLMs基礎學習&#xff08;七&#xff09;DeepSeek專題&#xff08;4&#xff09;DeepSeek-R1 訓練過程的四個階段具體流程小結 “規則化獎勵”具體原因小結 “自我認知”&#xff08;se…

SQL 速查手冊

前言&#xff1a;SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言&#xff0c;廣泛應用于數據查詢、更新、定義和管理等操作。本文將為你提供一份詳細的 SQL 速查手冊&#xff0c;涵蓋從基礎到高級的各種 SQL 操作&#xff0c;幫助你快…

IDEA 中 Scala 項目遠程連接虛擬機 Spark 環境

IDEA 中 Scala 項目遠程連接虛擬機 Spark 環境 1. 環境準備 確保虛擬機 Spark 環境正常運行 虛擬機中已安裝并啟動 Spark記錄虛擬機的 IP 地址和 Spark 端口&#xff08;默認 7077&#xff09;確保虛擬機防火墻允許相關端口訪問 本地 IDEA 環境配置 安裝 Scala 插件安裝 Spar…

.net core 項目快速接入Coze智能體-開箱即用-全局說明

目錄 一、Coze智能體的核心價值 二、開箱即用-效果如下 三 流程與交互設計 為什么要分析意圖&#xff0c;而不是全部交由AI處理。 四 接入前的準備工作 五&#xff1a;代碼實現----字節Coze 簽署 JWT和獲取Token .net core 項目快速接入Coze智能體-開箱即用 .net core快…

網店運營精細化突破新路徑

內容概要 電商戰場越來越卷&#xff0c;單純靠低價和流量轟炸已經玩不轉了。今天想要站穩腳跟&#xff0c;精細化運營才是破局密碼——從商品怎么選、用戶怎么留&#xff0c;到供應鏈怎么跑得更快&#xff0c;每個環節都得摳細節。比如用數據給選品“開天眼”&#xff0c;把用…

數據結構學習筆記 :線性表的鏈式存儲詳解

目錄 單鏈表 1.1 無頭單鏈表 1.2 有頭單鏈表單向循環鏈表雙鏈表 3.1 雙鏈表 3.2 雙向循環鏈表總結與對比 一、單鏈表 1. 無頭單鏈表&#xff08;Headless Singly Linked List&#xff09; 定義&#xff1a;鏈表無頭結點&#xff0c;直接由頭指針指向第一個數據節點。 特點&…

數據庫10(代碼相關語句)

while循環 declare avgprice numeric(10,2) set avgprice(select avg(price)from titles) //自定義參數 while avgprice<10 //循環條件 begin update titles set priceprice*1.1 end //循環語句操作&#xff0c;當avgprice<10,所有price都加0.1 case語句 查詢authors表…

Redis 下載與安裝(Windows版)

一、下載 1、redis官網&#xff1a; https://redis.io/downloads/ 2、Github下載地址&#xff1a; https://github.com/MicrosoftArchive/redis/releases 二、安裝 1、打開一個命令窗口&#xff0c;通過 cd 命令進入到你解壓的目錄 2、輸入命令 &#xff0c;啟動 Redis&…

在高數據速度下確保信號完整性的 10 個關鍵策略

隨著越來越多的傳感器連接到系統&#xff0c;需要快速、可靠和安全地傳輸更多數據&#xff0c;對帶寬和設計復雜性的需求也在增加。優先考慮的是確保從 A 發送到 B 的信號不會失真。 確保信號完整性 對于設計依賴于持續準確數據流的數據密集型應用程序的工程師來說&#xff0c…

NAT、代理服務、內網穿透

NAT、代理服務、內網穿透 1、NAT1.1、NAT過程1.2、NAPT2、內網穿透3、內網打洞3、代理服務器3.1、正向代理3.2、反向代理1、NAT 1.1、NAT過程 之前我們討論了IPv4協議中IP地址數量不充足的問題。NAT技術是當前解決IP地址不夠用的主要手段,是路由器的一個重要功能。 NAT能夠將…

利用互斥鎖或者利用邏輯過期解決緩存擊穿問題

緩存擊穿問題概述 緩存擊穿是指某個 熱點數據緩存過期 時&#xff0c;大量并發請求直接穿透緩存&#xff0c;同時訪問數據庫&#xff0c;導致數據庫壓力驟增甚至崩潰。以下是基于 互斥鎖 和 邏輯過期 的解決方案&#xff1a; 一、緩存擊穿的核心原因 熱點數據失效&#xff1a…

Vue3組合式API內核解析:從原子狀態到企業級架構

一、組合邏輯原子化設計 1.1 狀態管理層級拓撲 1.2 組合單元類型對照表 類型典型實現適用場景復用維度UI邏輯單元useForm/useTable表單/列表交互100%跨項目復用業務邏輯單元useOrderFlow訂單流程控制同項目跨模塊設備能力單元useGeolocation地理位置獲取跨技術棧復用狀態管理…

新生宿舍管理系統

收藏關注不迷路&#xff01;&#xff01; &#x1f31f;文末獲取源碼數據庫&#x1f31f; 感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff08;免費咨詢指導選題&#xff09;&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;希望幫助更多…

從零上手GUI Guider學習LVGL——Button

視頻教程請關注我b站&#xff1a;同學_好好學習&#xff0c;這里只是做相應的筆記文稿 從零上手GUI Guider學習LVGL——Buttton 前言&#xff1a; 首先我們為什么要學習LVGL設計工具呢&#xff1f; 1 降低開發難度 2 提高開發效率 所以我們需要學習一款合適的設計工具 在b站很少…

【AAOS】【源碼分析】Car UX Restrictions

AAOS UX的核心理念:安全駕駛是駕駛員的首要責任。汽車制造商和應用程序開發人員的所有設計都必須反映這一優先事項。 AAOS平臺允許設備制造商(OEM)對不同駕駛狀態下的限制進行定制。 駕駛員分心指南 只有符合Driver Distraction Guidelines的應用才可以在駕駛過程中運行。…

jvm調優工具arthas(阿爾薩斯)安裝與使用---實踐

jvm調優工具arthas(阿爾薩斯)安裝與使用—實踐 Arthas 是Alibaba開源的Java診斷工具&#xff0c;深受開發者喜愛。 當你遇到以下類似問題而束手無策時&#xff0c;Arthas可以幫助你解決&#xff1a; 這個類從哪個 jar 包加載的&#xff1f;為什么會報各種類相關的 Exception…

機器學習期末

選擇題 以下哪項不是機器學習的類型&#xff1f; A. 監督學習 B.無監督學習 C.半監督學習 D.全監督學習 D 哪一個是機器學習的合理定義? A、機器學習是計算機編程的科學 B、機器學習從標記的數據中學習 C、機器學習是允許機器人智能行動的領域 D、機器學習能使計算機能夠在…

3DMAX粒子流樣條線生成器PFSpliner使用方法詳解

3DMAX粒子流樣條線生成器&#xff0c;是一款功能強大且富有創意的工具。它能夠為“粒子流源”的每一個粒子生成專屬的動畫樣條線&#xff0c;這些樣條線描繪出粒子在空間中的運動軌跡&#xff0c;就如同為粒子繪制出了一條條獨特的“運動地圖”。更為出色的是&#xff0c;這些樣…