線性動態規劃

具有「線性」階段劃分的動態規劃方法統稱為線性動態規劃(簡稱為「線性 DP」),如下圖所示。

一、概念

如果狀態包含多個維度,但是每個維度上都是線性劃分的階段,也屬于線性 DP。比如背包問題、區間 DP、數位 DP 等都屬于線性 DP。

線性 DP 問題的劃分方法有多種方式。

  • 如果按照「狀態的維度數」進行分類,我們可以將線性 DP 問題分為:一維線性 DP 問題、二維線性 DP 問題,以及多維線性 DP 問題。
  • 如果按照「問題的輸入格式」進行分類,我們可以將線性 DP 問題分為:單串線性 DP 問題、雙串線性 DP 問題、矩陣線性 DP 問題,以及無串線性 DP 問題。

二、單串線性 DP 問題

1. 問題

單串線性 DP 問題:問題的輸入為單個數組或單個字符串的線性 DP 問題。狀態一般可定義為 dp[i],表示為:

  1. 「以數組中第 i個位置元素 nums[i]] 為結尾的子數組(nums[0]...nums[i])」的相關解。
  2. 「以數組中第 i?1個位置元素 nums[i?1]為結尾的子數組(nums[0]...nums[i?1])」的相關解。
  3. 「以數組中前 i個元素為子數組(nums[0]...nums[i?1])」的相關解

這 3 種狀態的定義區別在于相差一個元素 nums[i]。

  1. 第 1種狀態:子數組的長度為 i+1,子數組長度不可為空;
  2. 第 2 種狀態、第 3 種狀態:這兩種狀態描述是相同的。子數組的長度為 i,子數組長度可為空。在 i=0時,方便用于表示空數組(以數組中前 0 個元素為子數組)

三、最長遞增子序列

單串線性 DP 問題中最經典的問題就是「最長遞增子序列(Longest Increasing Subsequence,簡稱 LIS)」。

1. 實戰練習

給定一個整數數組 nums,找到其中最長嚴格遞增子序列的長度

  • 子序列:由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。
  • 1≤nums.length≤2500。
  • ?10^4≤nums[i]≤10^4。

2. 代碼

class Solution {// 定義長度最長遞增子序列的方法lengthOfLIS(nums) {// 獲取數組的長度const size = nums.length;// 創建并初始化動態規劃數組,初始值為1const dp = new Array(size).fill(1);// 外層循環迭代每個元素for (let i = 0; i < size; i++) {// 內層循環迭代當前元素之前的元素for (let j = 0; j < i; j++) {// 如果當前元素大于之前的元素,可以將當前元素加入遞增子序列if (nums[i] > nums[j]) {// 更新以當前元素結尾的遞增子序列的長度dp[i] = Math.max(dp[i], dp[j] + 1);}}}// 返回動態規劃數組中的最大值,即為最長遞增子序列的長度return Math.max(...dp);}
}// 示例用法
const solution = new Solution();
// 輸出最長遞增子序列的長度
console.log(solution.lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]));

四、最大子數組和

單串線性 DP 問題中除了子序列相關的線性 DP 問題,還有子數組相關的線性 DP 問題。

注意

  • 子序列:由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。
  • 子數組:指的是數組中的一個連續子序列。

「子序列」與「子數組」都可以看做是原數組的一部分,而且都不會改變原來數組中元素的相對順序。其區別在于數組元素是否要求連續。

1. 實戰練習

給定一個整數數組 nums,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和

2. 代碼

class Solution {maxSubArray(nums) {// 獲取數組的長度const size = nums.length;// 創建并初始化動態規劃數組,初始值為0const dp = new Array(size).fill(0);// 初始化動態規劃數組的第一個元素dp[0] = nums[0];// 從數組的第二個元素開始遍歷for (let i = 1; i < size; i++) {// 如果前一個元素的動態規劃值小于0,說明不利于累積當前元素,直接以當前元素為起點重新計算if (dp[i - 1] < 0) {dp[i] = nums[i];} else {// 否則,累積當前元素,更新動態規劃值dp[i] = dp[i - 1] + nums[i];}}// 返回動態規劃數組中的最大值,即為最大子數組和return Math.max(...dp);}
}// 示例用法
const solution = new Solution();
// 輸出最大子數組和
console.log(solution.maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4]));

五、最長的斐波那契子序列的長度

有一些單串線性 DP 問題在定義狀態時需要考慮兩個結束位置,只考慮一個結束位置的無法清楚描述問題。這時候我們就需要需要增加一個結束位置維度來定義狀態

1. 實戰練習

給定一個嚴格遞增的正整數數組 arr,從數組 arr 中找出最長的斐波那契式的子序列的長度。如果不存斐波那契式的子序列,則返回 0。

2. 代碼

class Solution {lenLongestFibSubseq(arr) {const size = arr.length;let ans = 0;// 枚舉所有可能的前兩個數for (let i = 0; i < size; i++) {for (let j = i + 1; j < size; j++) {let tempAns = 0;let tempI = i;let tempJ = j;let k = j + 1;// 在數組中搜索斐波那契子序列while (k < size) {// 如果當前三個數滿足斐波那契關系if (arr[tempI] + arr[tempJ] === arr[k]) {tempAns += 1;tempI = tempJ;tempJ = k;}k += 1;}// 更新最大斐波那契子序列長度if (tempAns > ans) {ans = tempAns;}}}// 如果找到了斐波那契子序列,返回長度加上初始的兩個數if (ans > 0) {return ans + 2;} else {return ans;}}
}// 示例用法
const solution = new Solution();
// 輸出最長斐波那契子序列的長度
console.log(solution.lenLongestFibSubseq([1, 2, 3, 4, 5, 6, 7, 8])); 

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

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

相關文章

Rust 學習筆記:使用自定義命令擴展 Cargo

Rust 學習筆記&#xff1a;使用自定義命令擴展 Cargo Rust 學習筆記&#xff1a;使用自定義命令擴展 Cargo Rust 學習筆記&#xff1a;使用自定義命令擴展 Cargo Cargo 支持通過 $PATH 中的 cargo-something 形式的二進制文件拓展子命令&#xff0c;而無需修改 Cargo 本身。 …

NodeMediaEdge任務管理

NodeMediaEdge任務管理 簡介 NodeMediaEdge是一款部署在監控攝像機網絡前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http視頻流并使用rtmp/kmp推送到公網流媒體服務器的工具。 在未使用NodeMediaServer的情況下&#xff0c;或是對部分視頻流需要單獨推送的需求&#xff0c;也可…

蒲公英盒子連接問題debug

1、 現象描述 2、問題解決 上圖為整體架構圖&#xff0c;其中左邊一套硬件設備是放在機房&#xff0c;右邊是放在辦公室。左邊的局域網連接了可以訪問外網的路由器&#xff0c;利用蒲公英作為旁路路由將局域網暴露在外網環境下。 我需要通過蒲公英作為旁路路由來進行遠程訪問&…

Golang 依賴注入:構建松耦合架構的關鍵技術

依賴注入&#xff08;Dependency Injection, DI&#xff09; 是一種設計模式&#xff0c;用于實現控制反轉&#xff08;Inversion of Control, IoC&#xff09;&#xff0c;通過將依賴項的創建和管理交給外部組件&#xff0c;而不是在類或函數內部直接創建依賴項&#xff0c;從…

Transformer核心原理

簡介 在人工智能技術飛速發展的今天&#xff0c;Transformer模型憑借其強大的序列處理能力和自注意力機制&#xff0c;成為自然語言處理、計算機視覺、語音識別等領域的核心技術。本文將從基礎理論出發&#xff0c;結合企業級開發實踐&#xff0c;深入解析Transformer模型的原…

虛擬線程與消息隊列:Spring Boot 3.5 中異步架構的演進與選擇

企業級開發領域正在經歷一場翻天覆地的巨變&#xff0c;然而大多數開發者卻對此渾然不覺&#xff0c;完全沒有意識到。Spring Boot 3.5 帶來的革命性的虛擬線程 (Virtual Threads) 和增強的響應式能力&#xff0c;絕不僅僅是小打小鬧的增量改進——它們正在從根本上改變我們對異…

網絡編程(計算機網絡基礎)

認識網絡 1.網絡發展史 ARPnetA(阿帕網)->internet(因特網)->移動互聯網->物聯網 2.局域網與廣域網 局域網 概念&#xff1a;的縮寫是LAN&#xff08;local area network&#xff09;&#xff0c;顧名思義&#xff0c;是個本地的網絡&#xff0c;只能實現小范圍短距…

Windows Server部署Vue3+Spring Boot項目

在Windows Server 上部署Vue3 Spring Boot前后端分離項目的詳細步驟如下&#xff1a; 一、環境準備 安裝JDK 17 下載JDK MSI安裝包&#xff08;如Oracle JDK 或 OpenJDK&#xff09; 雙擊安裝&#xff0c;配置環境變量&#xff1a; JAVA_HOME&#xff1a;JDK安裝路徑&#xf…

CCF CSP 第37次(2025.03)(3_模板展開_C++)(哈希表+stringstream)

CCF CSP 第37次&#xff08;2025.03&#xff09;&#xff08;3_模板展開_C&#xff09; 解題思路&#xff1a;思路一&#xff08;哈希表stringstream&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;哈希表stringstream&#xff09;&#xff09;&…

數據安全管理進階:81頁 2024數據安全典型場景案例集【附全文閱讀】

《2024 數據安全典型場景案例集》聚焦政務數據安全&#xff0c;覆蓋數據細粒度治理、授權運營、接口安全、系統接入、批量數據共享、使用側監管、風險監測、賬號管控、第三方人員管理、密碼應用等十大典型場景&#xff0c;剖析各場景風險并提供技術方案&#xff0c;如基于 AI 的…

Leetcode 261. 以圖判樹

1.題目基本信息 1.1.題目描述 給定編號從 0 到 n - 1 的 n 個結點。給定一個整數 n 和一個 edges 列表&#xff0c;其中 edges[i] [ai, bi] 表示圖中節點 ai 和 bi 之間存在一條無向邊。 如果這些邊能夠形成一個合法有效的樹結構&#xff0c;則返回 true &#xff0c;否則返…

【ISAQB大綱解讀】LG 1-8:區分顯性陳述和隱性假設(R1)

軟件架構師&#xff1a; 應明確提出假設或先決條件&#xff0c;從而防止隱性假設 知道隱性假設可能會導致利益相關方之間的潛在誤解 1. 應明確提出假設或先決條件&#xff0c;防止隱性假設 為什么重要&#xff1f; 隱性假設是架構風險的溫床 例如&#xff1a;假設“所有服務都…

IT運維工具的選擇標準有哪些?

選擇IT運維工具時&#xff0c;可參考以下標準&#xff0c;確保工具適配業務需求且高效易用&#xff1a; 1. 明確業務需求與場景 ? 核心目標&#xff1a;根據運維場景&#xff08;如監控、自動化、安全等&#xff09;匹配工具功能。例如&#xff0c;監控大規模集群選Promethe…

MySQL 核心知識整理【一】

一、MySQL存儲引擎對比&#xff1a;InnoDB vs MyISAM 在使用MySQL時&#xff0c;選擇合適的存儲引擎對性能影響很大。最常見的兩個引擎是 InnoDB 和 MyISAM&#xff0c;它們各自的設計目標不同&#xff0c;適用場景也不一樣。 事務與數據安全性方面&#xff0c;InnoDB 支持事…

人工智能在智能制造業中的創新應用與未來趨勢

隨著工業4.0和智能制造的快速發展&#xff0c;人工智能&#xff08;AI&#xff09;技術正在深刻改變制造業的各個環節。從生產自動化到質量檢測&#xff0c;從供應鏈優化到設備維護&#xff0c;AI的應用不僅提高了生產效率&#xff0c;還提升了產品質量和企業競爭力。本文將探討…

arc3.2語言sort的時候報錯:(sort < `(2 9 3 7 5 1)) 需要寫成這種:(sort > (pair (list 3 2)))

arc語言sort的時候報錯&#xff1a;(sort < (2 9 3 7 5 1)) arc> (sort < (2 9 3 7 5 1)) Error: "set-car!: expected argument of type <pair>; given: 9609216" arc> (sort < (2 9 3 )) Error: "Function call on inappropriate object…

Ubuntu 24.04 LTS Chrome 中文輸入法(搜狗等)失效?一行命令解決

Ubuntu 24.04 LTS Chrome 中文輸入法&#xff08;搜狗等&#xff09;失效&#xff1f;一行命令解決 在 Ubuntu 24.04 LTS 中&#xff0c;如果你發現 Chrome 瀏覽器用不了搜狗輸入法或其他 Fcitx5 中文輸入法&#xff0c;可以試試下面的方法。 直接上解決方案&#xff1a; 打…

大模型前處理-CPU

前處理包含哪些流程 分詞 tokenizationembedding CPU可以做哪些優化 分詞 分詞在做什么&#xff1f; 什么是詞元化&#xff1f; 詞元化&#xff08;Tokenization&#xff09;是把一段自然語言文本拆分成更小的單元&#xff08;稱為“詞元”&#xff0c;即 Token&#xff0…

Kafka數據怎么保障不丟失

在分布式消息系統中&#xff0c;數據不丟失是核心可靠性需求之一。Apache Kafka 通過生產者配置、副本機制、持久化策略、消費者偏移量管理等多層機制保障數據可靠性。以下從不同維度解析 Kafka 數據不丟失的核心策略&#xff0c;并附示意圖輔助理解。 一、生產者端&#xff1a…

圖像處理篇---face_recognition庫實現人臉檢測

以下是使用face_recognition庫實現人臉檢測的詳細步驟、實例代碼及解釋&#xff1a; 一、環境準備 1. 安裝依賴庫 pip install face_recognition opencv-python # 核心庫 pip install matplotlib # 用于顯示圖像&#xff08;可選&#xff09;2. 依賴說明 face_recognitio…