動態規劃:從暴力遞歸到多維優化的算法進化論(C++實現)


動態規劃:從暴力遞歸到多維優化的算法進化論

一、動態規劃的本質突破

動態規劃(Dynamic Programming)不是簡單的遞歸優化,而是計算思維范式的革命性轉變。其核心價值在于通過狀態定義決策過程形式化,將指數復雜度問題轉化為多項式復雜度。本文將揭示動態規劃的四個認知層級,并提供六大領域的深度實踐方案。


二、動態規劃四維認知體系

1. 狀態空間建模

// 經典01背包問題狀態定義
vector<vector<int>> dp(n+1, vector<int>(W+1, 0)); 
// dp[i][w] 表示前i個物品在容量w下的最大價值

2. 狀態轉移方程推導

dp[i][w] = max(dp[i-1][w], dp[i-1][w-weights[i-1]] + values[i-1]);

3. 計算順序設計

  • 正序/逆序選擇
  • 維度優先級規劃

4. 空間復雜度優化

// 滾動數組優化
vector<int> dp(W+1, 0);
for(int i=1; i<=n; ++i){for(int w=W; w>=weights[i-1]; --w){dp[w] = max(dp[w], dp[w-weights[i-1]] + values[i-1]);}
}

三、六大經典問題解剖

問題1:編輯距離(LeetCode 72)

int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size();vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for(int i=0; i<=m; ++i) dp[i][0] = i;for(int j=0; j<=n; ++j) dp[0][j] = j;for(int i=1; i<=m; ++i){for(int j=1; j<=n; ++j){if(word1[i-1] == word2[j-1]){dp[i][j] = dp[i-1][j-1];} else {dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}) + 1;}}}return dp[m][n];
}

復雜度

  • 時間復雜度:O(mn)
  • 空間復雜度:O(mn) → 可優化至O(n)

問題2:股票買賣(LeetCode 188)

int maxProfit(int k, vector<int>& prices) {int n = prices.size();if(n < 2) return 0;vector<vector<int>> hold(n, vector<int>(k+1, INT_MIN));vector<vector<int>> sold(n, vector<int>(k+1, 0));hold[0][0] = -prices[0];for(int i=1; i<n; ++i){for(int j=0; j<=k; ++j){hold[i][j] = max(hold[i-1][j], (j>0 ? sold[i-1][j-1] : INT_MIN) - prices[i]);sold[i][j] = max(sold[i-1][j], hold[i-1][j] + prices[i]);}}return *max_element(sold[n-1].begin(), sold[n-1].end());
}

優化點

  • 狀態機建模
  • 交易次數維度壓縮

四、動態規劃優化五重奏

1. 狀態壓縮技術

// 最長公共子序列空間優化
int LCS(string s1, string s2){vector<int> dp(s2.size()+1, 0);for(int i=1; i<=s1.size(); ++i){int prev = 0;for(int j=1; j<=s2.size(); ++j){int temp = dp[j];if(s1[i-1] == s2[j-1]){dp[j] = prev + 1;} else {dp[j] = max(dp[j], dp[j-1]);}prev = temp;}}return dp[s2.size()];
}

2. 決策單調性優化

適用于區間DP類問題,可將復雜度從O(n3)降至O(n2)


五、動態規劃思維訓練場

問題類型訓練重點推薦題目
線性DP狀態維度設計LeetCode 53, 300
區間DP決策點選擇策略LeetCode 312, 516
樹形DP后序遍歷實現LeetCode 337, 124
狀態壓縮DP位運算技巧LeetCode 464, 691
概率DP期望值計算LeetCode 688, 837
數位DP高位到低位決策LeetCode 233, 902

六、動態規劃調試方法論

1. 狀態轉移追蹤

void printDP(const vector<vector<int>>& dp){for(auto& row : dp){for(int val : row) cout << setw(3) << val;cout << endl;}cout << "----------------\n";
}

2. 逆向路徑重建

vector<int> findPath(const vector<vector<int>>& dp){vector<int> path;int i = dp.size()-1, j = dp[0].size()-1;while(i > 0 && j > 0){if(dp[i][j] == dp[i-1][j-1] + 1){path.push_back(i-1);--i, --j;} else if(dp[i][j] == dp[i-1][j]){--i;} else {--j;}}reverse(path.begin(), path.end());return path;
}

七、復雜度控制矩陣

問題規模狀態維度可解性優化策略
n ≤ 20O(2?)直接暴力枚舉狀態壓縮DP
n ≤ 100O(n3)需優化常數決策單調性/四邊形不等式
n ≤ 1e4O(n2)需空間優化滾動數組/降維打擊
n ≤ 1e5O(n)需線性遞推設計斜率優化/單調隊列

八、動態規劃認知躍遷路徑

  1. 暴力遞歸 → 發現重疊子問題
  2. 記憶化搜索 → 實現時間復雜度優化
  3. 狀態定義 → 建立形式化數學模型
  4. 空間壓縮 → 完成工程化改造
  5. 決策優化 → 達成理論最優解

掌握動態規劃的本質在于將直覺決策轉化為數學語言。建議從LeetCode簡單題開始,逐步挑戰區間DP、狀態壓縮等高級題型,最終在Codeforces/ACM競賽中驗證所學。記住:每個狀態轉移方程都是對問題本質的一次深刻洞察!

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

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

相關文章

數據結構與算法-數據結構-樹狀數組

概念 樹狀數組&#xff0c;也叫二叉索引樹&#xff08;Binary Indexed Tree&#xff0c;BIT&#xff09;&#xff0c;它是用數組來模擬樹形結構。樹狀數組的每個節點存儲的是數組中某一段的和&#xff08;或其他可合并的信息&#xff09;&#xff0c;通過巧妙的索引方式和樹形…

AI比人腦更強,因為被植入思維模型【19】三腦理論思維模型

定義 三腦理論思維模型是由美國神經科學家保羅麥克萊恩&#xff08;Paul MacLean&#xff09;提出的&#xff0c;該理論認為人類的大腦由三個不同但又相互關聯的部分組成&#xff0c;分別是爬蟲腦&#xff08;Reptilian Brain&#xff09;、邊緣腦&#xff08;Limbic Brain&am…

使用 patch-package 優雅地修改第三方依賴庫

在前端開發中&#xff0c;有時我們需要對第三方依賴庫進行修改以滿足項目需求。然而&#xff0c;直接修改 node_modules 中的文件并不是一個好方法&#xff0c;因為每次重新安裝依賴時這些修改都會丟失。patch-package 是一個優秀的工具&#xff0c;可以幫助我們優雅地管理這些…

馬科維茨均值—方差理論推導過程

下面給出一個詳細的、符號嚴謹、公式連貫的馬科維茨均值—方差理論推導過程&#xff0c;假設你輸入了 nnn 列股票的歷史收盤價數據。我們從數據符號的定義開始&#xff0c;逐步構建所有公式&#xff0c;并詳細解釋每個符號的意義。

僅靠prompt,Agent難以自救

Alexander的觀點很明確&#xff1a;未來 AI 智能體的發展方向還得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。還拿目前很火的 Manus 作為案例&#xff1a;他認為像 Manus 這樣基于「預先編排好的提示詞與工具路徑」構成的工作流智能體&#xff0c;…

【css酷炫效果】純CSS實現懸浮彈性按鈕

【css酷炫效果】純CSS實現懸浮彈性按鈕 緣創作背景html結構css樣式完整代碼效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;https://download.csdn.net/download/u011561335/90492020 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&…

決策樹基礎

決策樹 定義 從根節點開始&#xff0c;也就是擁有全部的數據&#xff0c;找一個維度對根節點開始劃分&#xff0c; 劃分后希望數據整體的信息熵是最小的&#xff0c; 針對劃分出來的兩個節點&#xff0c;我們繼續重復剛才的劃分方式尋找信息熵最小的維度和閾值。 遞歸這個…

動態查找表

1.問題分析&#xff1a; 動態查找表是一種可以動態地插入、刪除和查找元素的數據結構。它是基于二叉搜索樹實現的&#xff0c;具有快速的查找和插入操作。 以下是一些關于動態查找表的問題分析&#xff1a; 1. 插入操作&#xff1a;在動態查找表中插入一個元素時&#xff0c…

得分匹配的朗之萬動力學——Score-Matching Langevin Dynamics (SMLD)

得分匹配的朗之萬動力學——Score-Matching Langevin Dynamics (SMLD) 文章目錄 得分匹配的朗之萬動力學——Score-Matching Langevin Dynamics (SMLD)摘要Abstract周報內容0. 上期補充1. 本期的基本思想2. 從一個分布中采樣&#xff08;Sampling from a Distribution&#xff…

字節DAPO算法:改進DeepSeek的GRPO算法-解鎖大規模LLM強化學習的新篇章(代碼實現)

DAPO算法&#xff1a;解鎖大規模LLM強化學習的新篇章 近年來&#xff0c;大規模語言模型&#xff08;LLM&#xff09;在推理任務上的表現令人矚目&#xff0c;尤其是在數學競賽&#xff08;如AIME&#xff09;和編程任務中&#xff0c;強化學習&#xff08;RL&#xff09;成為…

【Qt】QWidget的styleSheet屬性

&#x1f3e0;個人主頁&#xff1a;Yui_ &#x1f351;操作環境&#xff1a;Qt Creator &#x1f680;所屬專欄&#xff1a;Qt 文章目錄 前言1. styleSheet屬性2. 利用styleSheet屬性實現簡單的日夜模式切換2.1 知識補充-計算機中的顏色表示 3. 總結 前言 style?好像前端的st…

QT Quick(C++)跨平臺應用程序項目實戰教程 2 — 環境搭建和項目創建

目錄 引言 1. 安裝Qt開發環境 1.1 下載Qt安裝包 1.2 安裝Qt 1.3 安裝MSVC編譯器 2. 創建Qt Quick項目 2.1 創建新項目 2.2 項目結構 2.3 運行項目 3. 理解項目代碼 3.1 main.cpp文件 3.2 Main.qml文件 引言 在上一篇文章中&#xff0c;我們介紹了本教程的目標和結…

macOS Sequoia 15.3 一直彈出“xx正在訪問你的屏幕”

&#x1f645; 問題描述 macOS 系統升級后&#xff08;15.2或者15.3均出現過此問題&#xff09;&#xff0c;不管是截圖還是開騰訊會議&#xff0c;只要跟捕捉屏幕有關&#xff0c;都一直彈出這個選項&#xff0c;而且所有軟件我都允許訪問屏幕了&#xff0c;這個不是詢問是否…

二叉樹的學習

目錄 樹型結構&#xff08;了解&#xff09; 概念 概念&#xff08;重要&#xff09; 樹的表示形式&#xff08;了解&#xff09; 樹的應用 二叉樹&#xff08;重點&#xff09; 概念 兩種特殊的二叉樹 二叉樹的性質 利用性質做題&#xff08;關鍵&#xff09; 二叉…

AbMole新生大鼠腦類器官培養Protocol

近日&#xff0c;希臘亞里士多德大學塞薩洛尼基分校的研究團隊在《神經科學方法》&#xff08;Journal of Neuroscience Methods&#xff09;期刊上發表了一項引人注目的研究&#xff0c;他們開發了一種基于新生大鼠腦組織的新型類器官培養協議&#xff0c;并展望其在阿爾茨海默…

物理環境與安全

物理安全的重要性 信息系統安全戰略的一個重要組成部分物理安全面臨問題 環境風險不確定性人類活動的不可預知性 典型的物理安全問題 自然災害環境因素設備安全、介質安全、傳輸安全 場地選擇 區域&#xff1a;避開自然災害高發區環境&#xff1a;原理可能的危險因素抗震&…

手動離線安裝NextCloud插件

1、下載離線插件安裝包 進入NextCloud官方插件商城&#xff1a;https://apps.nextcloud.com/ 選擇自己需要的插件軟件 選擇NextCloud對應版本的插件安裝包 2、解壓安裝 進入的到NextCloud安裝目錄的apps目錄 cd /var/www/html/apps 將下載的xxx.tar.gz復制到apps目錄中解…

算力100問?第93問:算力資源為何更分散了?

目錄 1、政策驅動與地方投資的盲目性 2、美國芯片斷供與國產替代的陣痛 3、政企市場對私有云的偏好 4、技術標準與供需結構的失衡 5、產業生態與市場機制的滯后 6、破局路徑與未來展望 在大模型和人工智能技術快速發展的背景下,算力資源已成為數字經濟時代的核心基礎設施…

基于HTML的郵件發送狀態查詢界面設計示例

以下是一個基于HTML的郵件發送狀態查詢界面設計示例&#xff0c;結合篩選功能、狀態展示和重新發送操作&#xff0c;采用Bootstrap框架實現響應式布局&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"&…

分治-快速排序系列一>快速排序

目錄 題目方法&#xff1a;優化方法&#xff1a;代碼&#xff1a; 題目方法&#xff1a; 忘記快速排序看這里&#xff1a;鏈接: link 優化方法&#xff1a; 代碼&#xff1a; public int[] sortArray(int[] nums) {qsort(nums,0,nums.length-1);return nums;}private void qso…