動態規劃中的 求“最長”、“最大收益”、“最多區間”、“最優策略” 雙重 for + 狀態轉移

以最長遞增子序列為例

🎯 首先明確目標

最長上升子序列(LIS)為例,假設輸入是:

nums := []int{10, 9, 2, 5, 3, 7, 101, 18}

我們定義:

dp[i]:以 nums[i] 為結尾的最長上升子序列長度

目標:求 dp[i] 的最大值。


🔍 雙重 for 的意義是什么?

for i := 1; i < n; i++ {for j := 0; j < i; j++ {if nums[j] < nums[i] {dp[i] = max(dp[i], dp[j] + 1)}}
}

這里我們來解釋:

? 第一層循環:從左到右遍歷每一個位置 i

我們要計算:以 nums[i] 結尾的“最長上升子序列”是多少?

? 第二層循環:查看所有在 i 之前的數 j

對于每一個前面的數 nums[j],判斷:

它是否可以作為 nums[i] 的前一個元素?
也就是判斷 nums[j] < nums[i]

如果是,就說明:

如果我以 j 為結尾的子序列有長度 dp[j]
那么我在它后面加上 nums[i],就可以構成一個更長的上升序列,長度是 dp[j] + 1

于是我們嘗試更新 dp[i]

dp[i] = max(dp[i], dp[j] + 1)

🔁 用人話解釋一遍:

“我想知道 nums[i] 能不能接在某個前面的上升序列后面,
如果能,那我就更新一下它作為結尾時,能組成多長的子序列。”


🧠 一個具體例子(帶注釋)

nums := []int{10, 9, 2, 5, 3, 7}初始化 dp := []int{1, 1, 1, 1, 1, 1}  // 每個位置起碼是自己i = 3, nums[3] = 5j = 0, nums[0] = 10 -> 跳過j = 1, nums[1] = 9 -> 跳過j = 2, nums[2] = 2 -> 2 < 5 -> 更新 dp[3] = max(1, dp[2] + 1) = 2i = 4, nums[4] = 3j = 0 -> 10 > 3 -> 跳過j = 1 -> 9 > 3 -> 跳過j = 2 -> 2 < 3 -> dp[4] = max(1, dp[2]+1) = 2j = 3 -> 5 > 3 -> 跳過i = 5, nums[5] = 7j = 0 -> 10 > 7 -> 跳過j = 1 -> 9 > 7 -> 跳過j = 2 -> 2 < 7 -> dp[5] = max(1, 1+1) = 2j = 3 -> 5 < 7 -> dp[5] = max(2, 2+1) = 3j = 4 -> 3 < 7 -> dp[5] = max(3, 2+1) = 3

🧩 為什么不能只用一個循環?

因為我們求的是:

“在前面所有滿足條件的數里,找一個最優的情況來更新當前的狀態”。

只有看完所有的 j < i 才能找到最優的更新路徑,所以必須有一個內層循環來“掃描過去”。


? 總結記憶方法:

  • i當前狀態

  • j過去狀態

  • if 條件成立,說明可以從過去 j 走到現在 i

  • dp[i] = max(dp[i], dp[j]+1) 就是取過去所有能轉移過來的路徑中最優的那一條

for i := 1; i < n; i++ {for j := 0; j < i; j++ {// 某種條件成立// dp[i] = max(dp[i], dp[j] + ...)}
}

這類“雙重 for + 狀態轉移”的寫法,在一類特定的動態規劃問題中非常經典和高頻。這類問題一般具有以下特征:


? 典型問題特征

  1. 子問題具有前后關系(i/j 結構)

    • 當前狀態 i 要依賴過去某些狀態 j < i

    • 類似“前綴分析”

  2. 具有單調性約束

    • nums[j] < nums[i]end[j] <= start[i] 等條件

  3. 求解最大/最小值

    • 求“最長”、“最大收益”、“最多區間”、“最優策略”


? 高頻問題示例

問題類型描述dp含義轉移條件
最長上升子序列 (LIS)找遞增的最大長度dp[i]:以 i 結尾的最長長度nums[j] < nums[i]
最長不下降子序列可以等于也遞增dp[i]nums[j] <= nums[i]
最長擺動子序列上下起伏交替up[i], down[i]比較大小后轉移
最大不重疊區間數按 end 排序后貪心/DPdp[i]:前 i 個的最大區間數end[j] <= start[i]
最大信封嵌套數(俄羅斯套娃)求最多可嵌套信封數對寬升高做 LISw[j] < w[i] && h[j] < h[i]
打家劫舍變形不偷相鄰的dp[i]:前 i 個最大金額dp[i] = max(dp[i-1], dp[i-2]+nums[i])
最大連續子數組積需要 max 和 minmax[i], min[i] 同時維護根據乘積正負轉移

? 模板結構(可抽象成函數)

for i := 1; i < n; i++ {for j := 0; j < i; j++ {if 滿足條件(j, i) {dp[i] = max(dp[i], dp[j] + 某個值)}}
}

? 小技巧:可以加上前向指針以恢復路徑

prev := make([]int, n) // 記錄轉移路徑
for i := range prev {prev[i] = -1
}
...
if dp[j] + 1 > dp[i] {dp[i] = dp[j] + 1prev[i] = j
}

如果你以后看到類似“最XXX的子序列”“最XXX的不重疊區間”,只要是“i依賴j”型的問題,幾乎都可以優先嘗試這個模板。

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

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

相關文章

SEO關鍵詞與長尾詞高效布局

內容概要 在SEO優化實踐中&#xff0c;關鍵詞布局的科學性與系統性直接影響流量的獲取效率與可持續性。本文以核心關鍵詞篩選為起點&#xff0c;結合長尾詞挖掘工具與語義關聯分析技術&#xff0c;逐步構建覆蓋用戶全搜索場景的內容矩陣。通過金字塔結構模型&#xff0c;實現高…

考研數一公式筆記

考研數學&#xff08;一&#xff09;核心結論與易錯點詳細筆記 第一部分&#xff1a;高等數學 一、函數、極限、連續 (一) 重要結論與公式 等價無窮小替換 (僅限乘除運算&#xff0c;極限過程為 x → 0 或某特定值導致因子→0)&#xff1a; sin x ~ x tan x ~ x arcsin x …

Debezium TableSchemaBuilder詳解

Debezium TableSchemaBuilder詳解 1. 類的作用與功能 1.1 核心作用 TableSchemaBuilder是Debezium中負責構建表Schema的核心類,主要功能包括: Schema構建:將數據庫表結構轉換為Kafka Connect的Schema定義主鍵處理:生成表的主鍵Schema值Schema處理:生成表的非主鍵字段Sc…

49 python Matplotlib之Pandas 數據可視化

Pandas 是 Python 中用于數據處理的核心庫,其內置了基于 Matplotlib 的可視化功能,可通過 DataFrame.plot() 和 Series.plot() 方法快速生成常見圖表,無需手動編寫繪圖代碼,大幅提升效率。 一、Pandas 核心繪圖方法 基礎語法如下:該代碼為偽代碼,僅做語法說明,無法執行…

《微服務架構設計模式》筆記

思維導圖 1-3章 4-6 章 5-13 章 資料 配套代碼倉庫&#xff1a;https://github.com/microservices-patterns/ftgo-application 作者網站&#xff1a;https://microservices.io/

手寫一個簡單的線程池

手寫一個簡單的線程池 項目倉庫&#xff1a;https://gitee.com/bossDuy/hand-tearing-thread-pool 基于一個b站up的課程&#xff1a;https://www.bilibili.com/video/BV1cJf2YXEw3/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 理…

手機打電話時由對方DTMF響應切換多級IVR語音菜單(完結)

手機打電話時由對方DTMF響應切換多級IVR語音菜單&#xff08;完結&#xff09; --本地AI電話機器人 上一篇&#xff1a;手機打電話時由對方DTMF響應切換多級IVR語音菜單&#xff08;話術腳本與實戰&#xff09; 下一篇&#xff1a;編寫中 一、前言 經過前面幾個篇章的詳細闡…

Android.mk解析

一、變量說明: 1.LOCAL_PATH:= $(call my-dir) 此行代碼在Android.mk的開頭,用于給出當前文件的路徑 LOCAL_PATH 用于在開發樹中查找源文件 宏函數’my-dir’, 由編譯系統提供,用于返回當前路徑(即包含Android.mk file文件的目錄) 2.LOCAL_PACKAGE_NAME := SecSettings …

ip地址改了網絡還能用嗎?ip地址改了有什么后果

當用戶發現自己的網絡出現異常時&#xff0c;常常會疑惑&#xff1a;如果IP地址被更改&#xff0c;網絡是否還能正常使用&#xff1f;要解答這個問題&#xff0c;需要從IP地址的作用、修改方式以及網絡配置等多個角度來分析。 一、IP地址的作用 IP地址是設備在網絡中的唯一標識…

Python-Django系列—日志

Python 程序員通常會在其代碼中使用 print() 作為一種快速和方便的調試工具。使用日志框架只比這多花一點點工夫&#xff0c;但更加優雅和靈活。除了用于調試之外&#xff0c;日志還可以為您提供有關應用程序狀態和健康狀況的更多信息&#xff0c;而且這些信息結構更清晰。 一…

ArcGIS Pro對圖斑進行等比例、等面積、等寬度的分割

ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放_arcgis視頻教程我要自學網-CSDN博客 4大遙感軟件&#xff01;遙感影像解譯&#xff01;ArcGISENVIErdaseCognition_遙感解譯軟件-CSDN博客 今天介紹一下ArcGIS Pro對圖斑進行等比例、等面積、等寬度的分割&#xff0…

”故茗”茶文化網站

摘 要 計算機網絡發展到現在已經好幾十年了&#xff0c;在理論上面已經有了很豐富的基礎&#xff0c;并且在現實生活中也到處都在使用&#xff0c;可以說&#xff0c;經過幾十年的發展&#xff0c;互聯網技術已經把地域信息的隔閡給消除了&#xff0c;讓整個世界都可以即時通話…

【和春筍一起學C++】(十五)字符串作為函數參數

1. char指針作為函數參數 在C語言中&#xff0c;表示字符串的方式有3種&#xff1a; char數組用引號括起的字符串常量char指針 這3種形式都可以將其作為實參傳遞給函數中的參數&#xff08;char*&#xff09;&#xff0c;因此函數的形參需要使用char*類型。將字符串作為參數…

VueRouter路由組件的用法介紹

1.1、<router-link>標簽 <router-link>標簽的作用是實現路由之間的跳轉功能&#xff0c;默認情況下&#xff0c;<router-link>標簽是采用超鏈接<a>標簽顯示的&#xff0c;通過to屬性指定需要跳轉的路由地址。當然&#xff0c;如果你不想使用默認的<…

【C/C++】勝者樹與敗者樹:多路歸并排序的利器

文章目錄 勝者樹與敗者樹&#xff1a;多路歸并排序的利器1 勝者樹簡介1.1 定義1.2 勝者樹結構與原理1.2.1 構造流程1.2.2 歸并過程 2 敗者樹簡介2.1 背景場景2.2 基本定義2.3 敗者樹結構和原理2.3.1 樹的構造&#xff08;初始建樹&#xff09;2.3.2 查詢和更新 3 勝者樹 vs 敗者…

零基礎設計模式——第二部分:創建型模式 - 原型模式

第二部分&#xff1a;創建型模式 - 5. 原型模式 (Prototype Pattern) 我們已經探討了單例、工廠方法、抽象工廠和生成器模式。現在&#xff0c;我們來看創建型模式的最后一個主要成員——原型模式。這種模式關注的是通過復制現有對象來創建新對象&#xff0c;而不是通過傳統的…

C++(初階)(十九)——紅黑樹

紅黑樹 紅黑樹概念規則實現結點插入變色變色參考代碼&#xff1a; 查找查找參考代碼 遍歷 紅黑樹檢查完整代碼 概念 紅?樹是?棵?叉搜索樹。它的每個結點增加?個存儲位來表示結點的顏?&#xff0c;可以是紅色或者黑色&#xff08;并不會出現第三種顏色&#xff09;。 通過…

Mistral AI 開源最新 Small 模型——Devstral-Small-2505

Devstral 是一款專為軟件工程任務設計的代理型大語言模型&#xff08;LLM&#xff09;&#xff0c;由 Mistral AI 和 All Hands AI 合作開發 &#x1f64c;。Devstral 擅長使用工具探索代碼庫、編輯多個文件以及驅動軟件工程代理。該模型在 SWE-bench 上表現出色&#xff0c;使…

CDGA|一線二線企業數據治理項目目前發展狀況

一線城市與二線城市企業在數據治理項目的發展狀況上存在一定差異&#xff0c;主要體現在目標、資源投入、策略實施以及文化培育等方面。 一線城市企業數據治理項目發展狀況 ?數據治理目標全面系統?&#xff1a; ?數據質量與安全?&#xff1a;一線城市的大型企業通常擁有海量…

Lyra學習筆記1地圖角色加載流程

目錄 1 地圖加載流程1.1 默認Experience的加載1.2 加載角色1.3 加載場景中的幾個傳送點 2 幾個內建類的筆記2.1 UDataAsset2.2 UAssetManager 純個人筆記&#xff0c;有錯誤歡迎指正&#xff0c;學習階段基本看到不會的就寫一寫&#xff0c;最后有時間會梳理整體結構 先看完了官…