Dp通用套路(閆式)

閆式dp分析法:

從集合角度來分析DP問題。

核心思想:

DP是一種求有限集中的最值或者個數問題

由于集合中元素的數量都是指數級別的,直接用定義去求,把每種方案都用dfs暴力枚舉一遍,時間復雜度很高,此時用DP問題去優化。

DP 優化兩個階段(核心思想)

?動態規劃解題步驟

步驟一:確定集合以及集合的屬性

將問題看成一個集合,按照上述集合劃分依據,分成若干不同子集。

按照屬性定義狀態,例如用 f[i] 表示考慮前 i 個元素時的某種最優解或狀態。

?步驟二: 狀態計算

找出狀態之間的關系,即狀態轉移方程。這個方程描述了如何從已知子集的解構建出整個集合的解。?

步驟三:確定初始值

確定基本情況或邊界條件。這些是狀態轉移方程中無法通過遞推得到,需要直接給出的值。有時候可以直接將f數組定義為全局數組,則數組的元素會被默認初始化為0。?

例如f[0] = 0 ,表示容量為0時的最大價值為0。?

步驟四:輸出結果

根據問題的要求,輸出最終結果。在很多情況下,最終結果存儲在 f[n] 中,其中 n 是問題的規模。?

eg:01背包問題

分析:

從2的n次方個方案中,找到總價值最大的方案,即有限集合中的最值問題,用閆式DP分析法來做。

分別求出左邊的最大值,右邊集合的最大值,兩邊取max,就是f(i,j)?的值

左邊=f(i-1,j)

右邊:每個方案都包含i,不變,要想值最大,需要前面變化的(1~i-1)部分最大

樸素代碼

?優化空間后的代碼

DP問題所有的優化都是對代碼做等價變形

等價變形過程如下

?由上圖分析可得,與原方程不等價。為了使之等價,可以將內層倒序循環(由大到小循環),這樣fj會比這件f(j-vi)先更新,那么此時用到的j-vi一定是上一層的,即第i-1層。

繼續優化,刪掉恒等式f[j]=f[j]等得到優化結果

注意:

必須保證代碼優化后是等價的?

內層循環:遍歷每個可能的容量是為了計算在不同容量限制下的最大價值,確保我們考慮了所有可能的容量。因為在考慮第i個物品是否放入背包的時候,我們需要用當前背包的容量減去第i個物品的體積,而第i個物品的體積是任意的,因此我們需要考慮第i個物品在所有可能的容量限制下的最大價值,從而能夠通過比較放入和不放入當前物品時的價值計算出在每個容量下的最大價值。

eg2:完全背包

閆式DP分析問題

?樸素代碼

優化空間后的代碼

按照01背包問題的方法做等價變形過程如下

?如圖,恰好等價

繼續優化,刪掉恒等式f[j]=f[j],將判斷條件放到內層循環初始化里,因為不滿足這個條件的部分會被直接跳過。

得到代碼

兩個問題狀態轉移方程如下

eg3:石子合并(區間DP問題)

分析

第一次可以選擇合并的堆數是n-1,因為一共有n排,選擇的相鄰堆一共n-1種選法。第二次合并的時候,就剩下n-1堆,相鄰兩堆的個數只剩下了n-2,所以第二次合并的時候只剩下了n-2種選法,以此類推,所有不同的合并順序一共有(n-1)!種。

滿足有限集,方案很多,可以考慮DP

由分析可知,最后合并的時候一定是把左邊的某一段和右邊的某一段合并,因此可以分界點作為劃分的依據,具體來說可以以左半邊連續一段的最后一堆,如上圖,最后一堆可以在第i個位置,以此類推。但至少要有兩堆,所以左邊這一堆最大到j-1,因此可以分成上面的j-i類。

現在只要把每一類求出來取一個min,即每個子集的min,再從這些min中取出一個最小值,就是整個集合的最小值。

最終的f[i][j]枚舉k,從i到j-1 ,在里面取一個min即可。

代碼

區間dp問題:先枚舉區間長度,再枚舉區間左端點,若區間長度為1,不用合并,所以從長度2開始枚舉。

因為要在區間長度一定的情況下,在同一[i,j]區間枚舉所有k的可能取值中最f[i][j]的最小值,可以先讓f[i][j]等于一個正無窮,然后再枚舉k

f[i][j]含義:所有將[i,j]區間合并成一堆的方案的集合中的最小值。

總體思想:把這一排石子看成一個集合,然后枚舉所有可能的區間當成一個子集。在每個區間中把石子分成左右兩堆,K為左右兩堆的分界點,每一次枚舉k,都要更新當前區間合并石子的最小值。最終根據f數組的含義,f[1][n]即為答案。

eg3:最長公共子序列

子串要求連續,子序列只要求相對順序。

一個長度為n的序列,據每個數是在或不在這個子序列兩種情況,所以一共有2的n次方個不同的子序列。暴力枚舉一定會超時,所以用dp來做。

分析

按照最后一個不同點劃分:第一個字符串的最后一個字符a[i]是否包含在這個子序列里,第二個字符串的最后一個字b[j]是否包含在這個字序列里來劃分。a[i]和b[j]是否包含各有兩種選擇,所以一共是四種選擇。用0表示不包含,1表示包含,前面的代表a[i],后面的代表b[j],四種情況如上圖

對于11這種情況,只有a[i]=b[j]時才存在

對于01這種情況,f(i-1, j) 不一定會存在 bj,但已經考慮了含概 bj 可能中的最大值,雖然不含 ai 和 bj 已經在 00 中考慮了,這里就是重復,求最大最小值,重復考慮是沒問題的,但是求和的時候不能重復考慮。

同理,對于10這種情況,重復考慮也是沒問題。

f[i][j]含義:所有序列a[1~i]與序列b[1~j]的公共子序列的集合中,最長公共子序列的長度。

因此,f[n][m]即為最終答案。

代碼

最后

我們要相信科學,不要相信玄學。

如果上述解釋有不對的地方,歡迎大家指正

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

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

相關文章

33、前臺搜索功能怎么實現?

輸入搜索的東西,如果為空 如果有 前端是提交表單,方式是 post 后端接受 調用 mybatisplus的categoryService.getById 用戶在搜索框內輸入關鍵字之后,執行 js 中的 load方法,前端提交表單, 后端 controller 中的loa…

Spring Boot 框架概述

1. 簡介 Spring Boot 是由 Pivotal 團隊開發的一個用于簡化 Spring 應用開發的框架。它通過提供默認配置、嵌入式服務器和自動配置等特性,讓開發者能夠更快速地構建獨立的、生產級別的 Spring 應用。 Spring Boot 的主要特點包括: 快速創建獨立的 Spri…

機器學習第二講:對比傳統編程:解決復雜規則場景

機器學習第二講:對比傳統編程:解決復雜規則場景 資料取自《零基礎學機器學習》。 查看總目錄:學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章:DeepSeek R1本地與線上滿血版部署:超詳細手把手指南 一、場景…

Jackson Databind

Jackson Databind 是 Java 生態中處理 JSON 數據的核心庫之一,主要用于實現 Java 對象與 JSON 數據之間的序列化與反序列化。它是 Jackson 庫家族的一部分,通常與 jackson-core 和 jackson-annotations 一起使用,共同完成 JSON 處理任務。 核…

MySQL 中的事務隔離級別有哪些?

MySQL 支持四種標準的事務隔離級別,從低到高依次為:讀未提交(READ UNCOMMITTED)、讀已提交(READ COMMITTED)、可重復讀(REPEATABLE READ) 和 串行化(SERIALIZABLE&#x…

RAG優化知識庫檢索(1):基礎概念與架構

1. 引言 大語言模型(LLM)常常面臨著知識時效性、幻覺生成、定制化難等挑戰,檢索增強生成(Retrieval-Augmented Generation, RAG)技術作為解決這些問題的有效方案,正在成為AI應用開發的標準架構。 本文將從基礎概念入手,全面介紹RAG技術的核心原理、標準架構與組件,以及評…

安卓工程build.gradle中的Groovy的常見知識點

文章目錄 變量定義函數定義函數調用閉包參數APK輸出配置多channel配置依賴配置關鍵總結常見混淆點groovy高度兼容java 變量定義 def debugCdnUrl "\"http://xxx\"" //變量賦值函數定義 def getTime() { // 函數定義(def 是 Groovy 中定義變…

阿里云 SLS 多云日志接入最佳實踐:鏈路、成本與高可用性優化

作者:裘文成(翊韜) 摘要 隨著企業全球化業務的擴展,如何高效、經濟且可靠地將分布在海外各地的應用與基礎設施日志統一采集至阿里云日志服務 (SLS) 進行分析與監控,已成為關鍵挑戰。 本文聚焦于阿里云高性能日志采集…

deep seek簡介和解析

deepseek大合集,百度鏈接:https://pan.baidu.com/s/10EqPTg0dTat1UT6I-OlFtg?pwdw896 提取碼:w896 一篇文章帶你全面了解deep seek 目錄 一、deep seek是什么 DeepSeek-R1開源推理模型,具有以下特點: 技術優勢: 市場定位&…

在ISOLAR A/B 工具使用UDS 0x14服務清除單個DTC故障的配置

在ISOLAR A/B 工具使用UDS 0x14服務清除單個DTC故障的配置如下圖所示 將DemClearDTCLimitation參數改成DEM_ALL_SUPPORTED_DTCS 此時0x14 服務就可以支持單個DTC的故障清除, 如果配置成 DEM_ONLY_CLEAR_ALL_DTCS 則只能夠用0x14服務清楚所有DTC。

Redis面試 實戰貼 后面持續更新鏈接

redis是使用C語言寫的。 面試問題列表: Redis支持哪些數據類型?各適用于什么場景? Redis為什么采用單線程模型?優勢與瓶頸是什么? RDB和AOF持久化的區別?如何選擇?混合持久化如何實現&#x…

Selenium自動化測試工具常見函數

目錄 前言 一、什么是自動化? 二、元素的定位 三、測試對象的操作 3.1輸入文本send_keys() 3.2按鈕點擊click() 3.3清除文本clear() 3.4獲取文本信息text 3.5獲取頁面的title與URL 四、窗口 4.1窗口的切換switch_to.window() 4.2窗口大小設置 …

seata 1.5.2 升級到2.1.0版本

一、部署1.5.2 1、解壓縮 tar -xvf apache-seata-***-incubating-bin.tar.gz 2、修改conf下的application.yml 只需要修改seata下的此配置,然后再nacos中添加其它配置,下面是application.yml的配置: server:port: 7091spring:applic…

Vue知識框架

一、Vue 基礎核心 1. 響應式原理 數據驅動:通過 data 定義響應式數據,視圖自動同步數據變化。 2、核心機制 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)實現數據劫持。依賴收集:追蹤…

Nginx靜態資源增加權限驗證

Nginx靜態資源增加權限驗證 一、前言二、解決思路2.1、方式一2.2、方式二三、代碼3.1、方式一3.1.1、前端代碼3.1.2、后端代碼3.1.3、Nginx調整3.1.4、注意事項3.2.方式二四、參考資料一、前言 在項目開發的過程中,項目初期,及大部分小型項目都是使用共享磁盤進行靜態文件的…

分析NVIDIA的股價和業績暴漲的原因

NVIDIA自2016年以來股價與業績的持續高增長,是多重因素共同作用的結果。作為芯片行業的領軍企業,NVIDIA抓住了技術、戰略、市場與行業趨勢的機遇。以下從技術創新、戰略布局、市場需求、財務表現及外部環境等維度,深入分析其成功原因&#xf…

更換芯片后因匝數比變化,在長距離傳輸時出現通訊問題。我將從匝數比對信號傳輸的影響、阻抗匹配等方面分析可能原因,并給出相應解決方案。

匝數比影響信號幅度與相位:原 HM1188 芯片匝數比 1:1,信號在變壓器原副邊傳輸時幅度基本不變;更換為 XT1188 芯片(匝數比 1:2)后,根據變壓器原理,副邊輸出信號幅度會變為原邊的 2 倍。短距離 10…

Python引領前后端創新變革,重塑數字世界架構

引言:Python 在前后端開發的嶄新時代 在當今數字化時代,軟件開發領域持續創新,而 Python 作為一門功能強大、應用廣泛的編程語言,正引領著前后端開發的變革浪潮。Python 以其簡潔易讀的語法、豐富的庫和框架生態系統,以及強大的跨領域適用性,在計算機領域占據了舉足輕重…

IP SSL證書常見問題助您快速實現HTTPS加密

一、什么是IP SSL證書? IP SSL證書是一種專門用于保護基于IP地址的網站或服務器的SSL證書。與傳統的域名SSL證書不同,它不需要綁定域名,而是直接與公網IP地址關聯。當用戶訪問該IP地址時,瀏覽器與服務器之間會建立加密連接&#…

「Mac暢玩AIGC與多模態27」開發篇23 - 多任務摘要合成與提醒工作流示例

一、概述 本篇基于興趣建議輸出的方式,擴展為支持多任務輸入場景,介紹如何使用 LLM 對用戶輸入的多項待辦事項進行摘要整合、生成重點提醒,并保持自然語言風格輸出,適用于任務總結、進度引導、日程提醒等輕量型任務生成場景。 二…