動態規劃:入門思考篇

1. 簡單類比

假如我們要求全國人數,那么我們只要知道各個省的人數,然后將各個省的人數相加即可,要想知道各個省的人數,只要將這個省下面所有的市人數相加即可,同樣,如果想要知道各個市的人數,只要知道下面所有縣的人數即可。

這就是動態規劃的核心思想:將原問題拆解為更小的子問題,求解每個子問題的最優解后,通過組合子問題的解得到原問題的解

類比邏輯動態規劃核心概念關鍵說明
全國人數(最終目標)原問題(Original Problem)需要求解的最終復雜問題。
省 / 市 / 縣人數子問題(Subproblems)原問題拆解出的、規模更小的同類問題(子問題需與原問題 “同結構”,如都是 “統計某區域人數”)。
省 = 市相加 / 市 = 縣相加狀態轉移方程(State Transition)子問題的解如何組合成父問題的解(你的例子中是 “求和”,DP 中可能是 “取最大 / 最小 / 累加” 等)。
縣人數(最底層)邊界條件(Base Case)無需再拆解的最小子問題,有直接已知的解(如 “某縣人數 = 統計局直接公布的數據”,無需再拆到鄉鎮)。

在這里插入圖片描述

2. “分治” 與 “最優子結構”

如果我們有很多種解決方案,但是我們想要找出最優的方案。一種方法就是,我們將所有的方案劃分成不同的集合,這些集合之間互不重疊,結合內部也沒有重合的方案,此時我們只要求解出各個集合的最優方案,然后從最優方案中選出最優即可。

要確保通過 “劃分集合→找集合最優→選最終最優” 能得到全局最優解,需滿足以下兩點,這是避免 “漏掉最優方案” 或 “選不出真最優” 的核心:

  • 前提 1:集合的 “完全覆蓋性”
    劃分的所有集合必須覆蓋全部可能的解決方案,不能有遺漏。
    例如:若要選 “從家到公司的最優路線”,若只劃分 “走地鐵” 和 “騎自行車” 的集合,卻漏掉 “坐公交” 的集合,可能恰好 “坐公交” 是耗時最短的最優方案,最終結果就會出錯。
  • 前提 2:“最優子結構” 成立
    每個集合的 “局部最優方案”,必須是支撐 “全局最優方案” 的候選。換句話說,全局最優方案一定來自某個集合的局部最優方案,不會存在 “某個集合的非最優方案,比所有集合的最優方案更好” 的情況。
    例如:若劃分 “從家到公司走東邊” 和 “走西邊” 兩個集合,若 “東邊集合的最優路線(20 分鐘)” 和 “西邊集合的最優路線(25 分鐘)”,則全局最優一定是東邊的 20 分鐘,不會存在 “東邊集合里某條 22 分鐘的路線,比西邊最優還快” 的矛盾 —— 這就是最優子結構的體現。
你的通用框架動態規劃(DP)的補充細節貪心算法的補充細節
劃分互不重疊的方案集合劃分的 “集合” 對應 “子問題”,且子問題存在重疊性(需存儲解避免重復計算)劃分的 “集合” 對應 “每一步的選擇”,且需滿足貪心選擇性質(每步選局部最優就能推全局最優)
求每個集合的最優方案通過 “狀態轉移方程” 計算子問題最優解(依賴更小的子問題)直接選擇當前集合的 “局部最優”(無需依賴后續子問題,一步到位)
從局部最優中選全局最優最終問題的解就是最頂層子問題的最優解所有步驟的局部最優累加 / 組合,直接得到全局最優

3. 青蛙跳臺階

假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

我們想要知道n階的方案數,只要知道n-1階的方案數和n-2階的方案數即可。假如n=5

  1. 跳到第4階的方案集合
    1->2->3->4->5
    1->2->4->5
    2->4->5
    2->3->4->5
    
  2. 跳到第3階的方案集合
    1->2->3->5
    2->3->5
    1->3->5
    

總之要想跳到第5階,那么一定是從第3階或者第4階過來的,方案數也就是這兩種集合方案數的和。我不知道跳到第4的階的方案是什么,也不知道跳到第3階的方案是什么,但是按照第3階和第4階,我可以將跳到第5階所有的方案分成不重合的兩個集合,只要求出這兩個集合的方案數,然后相加就是最后的方案數。

這兩個集合把所有的方案不重不漏的劃分開來,符合無重疊性和完全覆蓋性。第一個集合的所有方案,最后一步必然經過第4階臺階,第二個集合的所有方案,最后一步必然經過第3階臺階。

4. 集合的唯一劃分標準

這里有一個困惑,集合一中不是也會有方案經過3嗎,為什么不會與集合二重疊呢?

兩個集合的劃分標準是 “最后一步的來源”,而非 “方案是否經過某個中間臺階”,因此即使集合一的方案經過 3 階,也不會與集合二重疊

  • 集合一(來自 n-1 階):所有方案的最后一步是 “從第 4 階跳 1 階到第 5 階”(無論這個方案在到達 4 階之前,是否經過 3 階、2 階等)。
    例:方案 “1→2→3→4→5”,最后一步是 “4→5”,屬于集合一;哪怕方案是 “1→3→4→5”,最后一步仍是 “4→5”,也屬于集合一。
  • 集合二(來自 n-2 階):所有方案的最后一步是 “從第 3 階跳 2 階到第 5 階”(無論這個方案在到達 3 階之前,是否經過 2 階、1 階等)。
    例:方案 “1→2→3→5”,最后一步是 “3→5”,屬于集合二;哪怕方案是 “1→3→5”,最后一步仍是 “3→5”,也屬于集合二。

一個方案的 “最后一步” 是唯一的、不可拆分的,這是避免重疊的核心:

  • 集合一的方案,無論中間是否經過 3 階,其 “最后一步” 必然是 “4→5”(跳 1 階);
  • 集合二的方案,無論中間是否經過其他臺階,其 “最后一步” 必然是 “3→5”(跳 2 階)。

這就像 “無論你之前走了哪條路,最后一步是‘邁左腳進門’還是‘邁右腳進門’,是完全不同的兩個動作”—— 不會存在一個方案,“最后一步既從 4 階跳 1 階,又從 3 階跳 2 階”,因此兩個集合絕對無重疊。

5. 01背包問題

有N件物品和一個最多能被重量為W 的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價值總和最大。
比如有3個物品,a,b,c,d每個物品的價值為10, 15,20,30,重量分別為1,2,2,3,背包的重量為4

我們有2N2^N2N中選擇,也就有2N2^N2N中方案,我們從這些方案中選擇一個最優的方案,能裝下的價值最大。

如果我們能將所有的方案分組,然后獲取每個組內的最大價值,那么最大的那個價值就是最終的價值。一種簡單的劃分就是我們是否選擇某個物品,例如我們是否選擇a

  1. 選擇a的方案
    a
    a, b
    a, c
    a, d
    a, b, c
    a, b, d
    a, c ,d
    
  2. 不選擇a的方案
    b
    b, c
    b, d
    c
    c,d
    d
    

可以看到兩種方案完全沒有重合,因為集合一全部的方案都包含a,集合二所有的方案都不包含a,通過這種集合劃分方式,我們得到了所有的方案,并且兩個集合中沒有重復的方案。對于集合一和集合二,我們可以再次通過是否選擇b劃分為更小的集合。
在這里插入圖片描述

子問題重疊

你的類比中,子問題(省、市、縣)是 “互不重疊” 的(一個縣只屬于一個市,一個市只屬于一個省),而動態規劃的典型場景中,子問題往往是 “重疊” 的(即不同父問題可能依賴同一個子問題的解)。

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

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

相關文章

小楊的 X 字矩陣(舉一反三)-洛谷B3865 [GESP202309 二級]

題目描述 小楊想要構造一個 X 字矩陣( 為奇數),這個矩陣的兩條對角線都是半角加號 ,其余都是半角減號 - 。例如,一個 55 的 X 字矩陣如下: --- --- ---- --- --- 請你幫小楊根據給定的 打印出對應的“X …

數據組合與合并:Pandas 數據整合全指南 +缺失值處理

數據組合與合并:Pandas 數據整合全指南在進行數據分析之前,數據清洗與整合是關鍵步驟。 遵循“整潔數據”(Tidy Data)原則: 每個觀測值占一行每個變量占一列每種觀測單元構成一張獨立的表格 整理好數據后,常…

c#聯合halcon的基礎教程(案例:亮度計算、角度計算和缺陷檢測)(含halcon代碼)

目錄 1.環境配置 2.案例一:亮度計算 halcon代碼: 主界面代碼: 3.案例二: 角度計算 halcon代碼: 主界面代碼: 4.案例三:缺陷檢測 halcon代碼: 主界面代碼: 通過…

大數據云原生是什么

"云原生"(Cloud Native)指的是?利用云計算原生優勢(彈性、按需服務、自動化、分布式等)來設計、構建、部署和運行大數據應用和工作負載的方法論與技術體系?。它不是簡單地“把大數據平臺搬到云上”,而是從…

Pytest項目_day16(yaml和parametrize結合)

查詢手機號歸屬地 我們首先可以在YAML文件中定義測試數據 方式一,使用- 注意:當我們需要一次傳入兩個參數時,需要定義兩層迭代,即兩層列表不夠直觀,容易寫錯 輸出的結果為: 然后我們可以將測試數據傳入test…

【Nginx指南】從核心原理到生產實踐

目錄Nginx指南:從核心原理到生產實踐引言:Nginx在現代架構中的核心地位一、Nginx核心能力與應用場景1.1 多場景適配的全能型中間件1.2 技術優勢:Nginx成為行業標準的關鍵二、Nginx安裝部署:源碼編譯與包管理方案2.1 源碼編譯&…

物體檢測

目錄 1 目標定位 2 地標檢測 3 目標檢測 4 在卷積網絡上實現滑動窗口 5 邊界框預測 6 交并比 7 非極大值抑制 8 錨框 9 YOLO算法 10 用u-net進行語義分割 11 轉置卷積 12 u-net 結構靈感 1 目標定位 你已經對圖片分類有所了解。例如通過這張圖片可以識…

es7.x es的高亮與solr高亮查詢的對比對比說明

一 solr&es高亮1.1 solr與es高亮功能解釋說明:1)高亮配置:fragmentSize(1000) 設置片段長度numOfFragments(1) 指定返回的片段數量preTags() 和 postTags() 設置高亮標記2)字段處理差異:在 ES 中,使用 matchQuery 而非 termQ…

DSP音頻算法工程師技能2

一、核心知識準備1. 算法原理3A算法(AGC自動增益控制/AEC回聲消除/ANS降噪):掌握AEC的NLMS/雙講檢測原理,ANS的譜減法/維納濾波,AGC的壓縮曲線設計。熟悉Speex/WebRTC等開源實現。EQ音效:IIR/FIR濾波器設計…

第4章-04-用WebDriver頁面元素操作

??作者簡介,黑夜開發者,CSDN領軍人物,全棧領域優質創作者?,CSDN博客專家,阿里云社區專家博主,2023年CSDN全站百大博主。 ??數年電商行業從業經驗,歷任核心研發工程師,項目技術負責人。 ??本文已收錄于專欄:Web爬蟲入門與實戰精講,后續完整更新內容如下。 文章…

【計算機視覺與深度學習實戰】04基于K-Means聚類的圖像分割系統設計與實現

摘要 圖像分割作為計算機視覺領域的基礎任務,在目標檢測、醫學影像分析、自動駕駛等眾多應用中發揮著關鍵作用。本文基于K-Means聚類算法設計并實現了一個完整的圖像分割系統,該系統集成了多種顏色空間轉換、自定義初始化策略、空間特征融合等先進技術。通過Python和Tkinter…

Android Studio常用知識總結

一、運行方式1.運行 (Run)當您選擇“運行”時,Android Studio 會編譯您的應用并將其安裝到目標設備或模擬器上。這通常用于:快速部署: 您只想看看應用是否能正常啟動并運行,或者進行一些基礎的用戶界面測試。性能測試: 在正常運行模式下測試應…

設計模式筆記_行為型_訪問者模式

1. 訪問者模式介紹訪問者模式(Visitor Pattern)是一種行為型設計模式,它允許你在不改變對象結構的前提下,定義作用于這些對象的新操作。訪問者模式將操作的邏輯從對象結構中分離出來,使得你可以在運行時動態地添加新的…

數學建模 14 中心對數比變換

用途:是處理成分數據的核心預處理方法,核心目標是解決成分數據的和為常數100% , 導致的維度冗余,非線性相關問題。使得數據滿足傳統的統計/建模方法;舉例子:食品比例中 面粉(50%),糖(30%),水(20%)原理&…

【C語言強化訓練16天】--從基礎到進階的蛻變之旅:Day7

🔥個人主頁:草莓熊Lotso 🎬作者簡介:C研發方向學習者 📖個人專欄: 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言:生活是默默的堅持,毅力是永久的…

污水處理行業的 “智能革命”:邊緣計算網關如何重塑傳統運維模式?

污水處理行業的 “智能革命”:邊緣計算網關如何重塑傳統運維模式?在污水處理這一關乎生態環境與可持續發展的關鍵領域,藍蜂網關正憑借其先進技術與強大功能,發揮著無可替代的重要作用。作為工業級物聯網解決方案的核心組件&#x…

ASP.NET Core 中的多租戶 SaaS 應用程序

介紹隨著軟件即服務 (SaaS) 持續主導技術領域,構建能夠高效地從單一代碼庫服務于多位客戶(租戶)的應用程序變得至關重要。ASP.NET Core 憑借其模塊化和可擴展的架構,是實現多租戶 SaaS 應用程序的強大框架。本文將指導您了解構建多…

JUC之CompletableFuture【中】

文章目錄四、CompletableFuture基本使用4.1 默認線程池、無返回值4.2 默認線程池、有返回值4.3 自定義線程池、有返回值4.4 CompletableFuture 獲取結果五、對結果進行處理5.1 方法說明5.2 示例5.3 thenApply vs thenApplyAsync5.3.1 核心區別: 執行線程不同5.3.2 thenApply: 同…

環境變量不生效?

目錄 添加環境變量 解決不生效 不生效場景 解決辦法 大家都知道Windows系統對于開發者來說并不友好,尤其是新手,當然這是相比于linux和MacOS相比,因為開發工具、項目腳本等環境配置要為復雜,注意事項也更多一些。而這篇文章將…

小迪安全v2023學習筆記(六十六講)—— Java安全SQL注入SSTISPELXXE

文章目錄前記WEB攻防——第六十六天Java安全&SPEL表達式&SSTI模板注入&XXE&JDBC&MyBatis注入環境搭建Hello-Java-SecJavaSecJava安全 - SQL注入-JDBC&MyBatisJDBC注入原理語句拼接預編譯的錯誤使用JdbcTemplate正則過濾MyBatis注入原理Like注入Order B…