動態規劃填表技巧:固定最后一個數 vs 固定倒數第二個數

????????在動態規劃中,填表時固定最后一個數還是倒數第二個數,取決于問題的定義和狀態轉移方程的設計。


目錄

1. 固定最后一個數

適用場景

特點

示例

2. 固定倒數第二個數

適用場景

特點

示例

3. 固定最后一個數與倒數第二個數的對比

4. 總結


1. 固定最后一個數

適用場景

  • 當問題的解與以某個位置為結尾的子問題相關時,通常固定最后一個數。

  • 例如:最大子數組和、最長遞增子序列(LIS)等問題。

特點

  • 狀態定義通常為?dp[i],表示以第?i?個元素為結尾的最優解。

  • 狀態轉移方程通常依賴于前一個狀態(dp[i-1])或前面所有狀態。

示例

  • 最大子數組和
    狀態定義:dp[i]?表示以?nums[i]?為結尾的最大子數組和。
    狀態轉移:dp[i] = max(nums[i], dp[i-1] + nums[i])
    代碼:

    int maxSubArray(vector<int>& nums) {int dp = nums[0], res = dp;for (int i = 1; i < nums.size(); i++) {dp = max(nums[i], dp + nums[i]);res = max(res, dp);}return res;
    }
  • 最長遞增子序列(LIS)
    狀態定義:dp[i]?表示以?nums[i]?為結尾的最長遞增子序列長度。
    狀態轉移:dp[i] = max(dp[i], dp[j] + 1),其中?j < i?且?nums[j] < nums[i]
    代碼:

    int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(), 1);int res = 1;for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = max(dp[i], dp[j] + 1);}}res = max(res, dp[i]);}return res;
    }

2. 固定倒數第二個數

適用場景

  • 當問題的解與子問題的中間狀態相關時,通常固定倒數第二個數。

  • 例如:最長公共子序列(LCS)、編輯距離等問題。

特點

  • 狀態定義通常為?dp[i][j],表示前?i?個元素和前?j?個元素之間的某種關系。

  • 狀態轉移方程通常依賴于?dp[i-1][j-1]dp[i-1][j]?或?dp[i][j-1]

示例

  • 最長公共子序列(LCS)
    狀態定義:dp[i][j]?表示字符串?A?的前?i?個字符和字符串?B?的前?j?個字符的最長公共子序列長度。
    狀態轉移:

    if (A[i-1] == B[j-1]) {dp[i][j] = dp[i-1][j-1] + 1;
    } else {dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
    }

    代碼:

    int longestCommonSubsequence(string text1, string text2) {int m = text1.size(), n = text2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (text1[i-1] == text2[j-1]) {dp[i][j] = dp[i-1][j-1] + 1;} else {dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}}return dp[m][n];
    }
  • 編輯距離
    狀態定義:dp[i][j]?表示將字符串?A?的前?i?個字符轉換為字符串?B?的前?j?個字符所需的最小操作次數。
    狀態轉移:

    if (A[i-1] == B[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;
    }

    代碼:

    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];
    }

3. 固定最后一個數與倒數第二個數的對比

特性固定最后一個數固定倒數第二個數
適用問題子數組、子序列問題雙序列、矩陣類問題
狀態定義dp[i]?或?dp[i][j]dp[i][j]
狀態轉移依賴前一個狀態或前面所有狀態依賴?dp[i-1][j-1]?等中間狀態
典型問題最大子數組和、LISLCS、編輯距離

4. 總結

  • 固定最后一個數:適用于子數組或子序列問題,狀態轉移通常依賴于前一個狀態或前面所有狀態。

  • 固定倒數第二個數:適用于雙序列或矩陣類問題,狀態轉移通常依賴于中間狀態(如?dp[i-1][j-1])。

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

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

相關文章

【C】鏈式二叉樹算法題2

目錄 1 另一棵樹的子樹 1&#xff09; 題目描述 示例1&#xff1a; 示例2&#xff1a; 2&#xff09; 算法解析 3&#xff09; 代碼 2 二叉樹的遍歷 1&#xff09; 問題描述 2&#xff09; 算法解析 3&#xff09; 代碼 3 總結 1 另一棵樹的子樹 leetcode鏈接…

配置Hadoop集群

Hadoop的運行模式 本地運行&#xff1a;在一臺單機上運行&#xff0c;沒有分布式文件系統&#xff0c;直接讀寫本地操作系統的文件系統。特點&#xff1a;不對配置文件進行修改&#xff0c;Hadoop 不會啟動 偽分布式&#xff1a;也是在一臺單機上運行&#xff0c;但用不同的 …

python辦公自動化--數據可視化(pandas+matplotlib)--生成條形圖和餅狀圖

前言 前幾天我們學習了pandas讀取數據&#xff0c;還學習了如何用patplotlib繪制柱狀圖和折線圖。 今天我們繼續學習&#xff0c;如何繪制條形圖和餅狀圖。 一、課程回顧-pandas讀取數據 1.示例數據文件 這里我們用到的依舊是d盤底下的這個excel工作簿&#xff0c;這個工作簿…

基于大模型的結節性甲狀腺腫診療全流程預測與方案研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 1.3 國內外研究現狀 二、大模型預測原理與方法 2.1 相關大模型概述 2.2 數據收集與預處理 2.3 模型訓練與驗證 三、術前預測與評估 3.1 結節性質預測 3.1.1 良惡性判斷 3.1.2 與傳統診斷方法對比 3.2 手術風險預測…

不同開發語言對字符串的操作

一、字符串的訪問 Objective-C: 使用 characterAtIndex: 方法訪問字符。 NSString *str "Hello, World!"; unichar character [str characterAtIndex:0]; // 訪問第一個字符 H NSLog("%C", character); // 輸出: H NSString 內部存儲的是 UTF-16 編…

Java開發者如何接入并使用DeepSeek

目錄 一、準備工作 二、添加DeepSeek SDK依賴 三、初始化DeepSeek客戶端 四、數據上傳與查詢 五、數據處理與分析 六、實際應用案例 七、總結 【博主推薦】&#xff1a;最近發現了一個超棒的人工智能學習網站&#xff0c;內容通俗易懂&#xff0c;風格風趣幽默&#xff…

S19文件格式詳解:汽車ECU軟件升級中的核心鏡像格式

文章目錄 引言一、S19文件格式的起源與概述二、S19文件的核心結構三、S19在汽車ECU升級中的應用場景四、S19與其他格式的對比五、S19文件實例解析六、工具鏈支持與安全考量七、未來趨勢與挑戰結語引言 在汽車電子控制單元(ECU)的軟件升級過程中,S19文件(也稱為Motorola S-…

CTF雜項——[suctf 2019]簽到題

base64轉圖片 可以直接用隨波逐流 得到flag SUCTF{ffffffffT4nk}

【Python】整數除法不正確,少1的問題,以及有關浮點數轉換的精度問題

1. 問題 今天在做leetcode 不同路徑 的時候發現了個問題 對于m53 n4class Solution:def uniquePaths(self, m: int, n: int) -> int:rlt 1for i in range(0, m-1):rlt * (m n - 2 - i)for i in range(0, m-1):rlt / (i 1)return int(rlt)為什么這個結果是 26234class S…

AI無代碼平臺

以下是目前支持快速開發產品的高生產力免費AI無代碼平臺推薦&#xff0c;按功能和適用場景分類&#xff1a; 一、全棧應用開發類 Bolt.DIY DeepSeek-R1 無需編寫代碼即可開發全棧應用&#xff0c;提供免費API和無速率限制&#xff0c;支持AI編碼助手與自動化流程 。 優勢&…

Gini系數的應用 - 指標波動貢獻分析

基尼系數的定義 基尼系數是衡量數據分布不均衡程度的指標&#xff0c;取值范圍在0到1之間&#xff1a; 0 表示完全均衡&#xff08;所有值相等&#xff09;。1 表示完全不均衡&#xff08;所有值集中在一個點&#xff09;。 基尼系數的計算公式 假設有 n n n 個數據點&…

第一節: 網絡基礎與參考模型

深入理解OSI七層模型與TCP/IP四層模型:網絡工程師的入門指南 在網絡通信的世界中,OSI七層模型和TCP/IP四層模型是理解網絡架構的基礎。無論是配置路由器、排查網絡故障,還是設計復雜的網絡系統,掌握這些模型的分層結構及其功能都是必不可少的。本文將從新手角度出發,深入…

HTTP拾技雜談

HTTP拾技雜談 簡單聊聊HTTP中的那些東西 文章目錄 HTTP拾技雜談前言HTTP協議1.請求從客戶端到服務器端的4個步驟一般客戶端請求如下&#xff1a;服務端響應如下 2.Keep-AliveHTTP方法Cookie 總結 前言 超文本傳輸協議&#xff08;Hypertext Transfer Protocol &#xff0c;HT…

用Deepseek寫一個五子棋微信小程序

在當今快節奏的生活中&#xff0c;休閑小游戲成為了許多人放松心情的好選擇。五子棋作為一款經典的策略游戲&#xff0c;不僅規則簡單&#xff0c;還能鍛煉思維。最近&#xff0c;我借助 DeepSeek 的幫助&#xff0c;開發了一款五子棋微信小程序。在這篇文章中&#xff0c;我將…

自然語言處理:最大期望值算法

介紹 大家好&#xff0c;博主又來給大家分享知識了&#xff0c;今天給大家分享的內容是自然語言處理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文簡稱為EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型參數的過程分成…

【從零開始學習計算機科學】計算機體系結構(一)計算機體系結構、指令、指令集(ISA)與量化評估

【從零開始學習計算機科學】計算機體系結構(一)計算機體系結構、指令、指令集(ISA)與量化評估 概論計算機體系結構簡介計算機的分類并行體系結構指令集體系結構(ISA)分類存儲器尋址尋址模式操作數大小指令ISA的編碼程序的優化計算機體系結構量化評估存儲器體系結構概論 …

Electron使用WebAssembly實現CRC-32 常用標準校驗

Electron使用WebAssembly實現CRC-32 常用標準校驗 將C/C語言代碼&#xff0c;經由WebAssembly編譯為庫函數&#xff0c;可以在JS語言環境進行調用。這里介紹在Electron工具環境使用WebAssembly調用CRC-32 常用標準格式校驗的方式。 CRC-32 常用標準校驗函數WebAssembly源文件…

Docker基礎篇——Ubuntu下Docker安裝

大家好我是木木&#xff0c;在當今快速發展的云計算與云原生時代&#xff0c;容器化技術蓬勃興起&#xff0c;Docker 作為實現容器化的主流工具之一&#xff0c;為開發者和運維人員帶來了極大的便捷 。下面我們一起進行Docker安裝。 Docker的官方Ubuntu安裝文檔&#xff0c;如…

第五課:Express框架與RESTful API設計:技術實踐與探索

在使用Node.js進行企業應用開發&#xff0c;常用的開發框架Express&#xff0c;其中的中間件、路由配置與參數解析、RESTful API核心技術尤為重要&#xff0c;本文將深入探討它們在應用開發中的具體使用方法&#xff0c;最后通過Postman來對開發的接口進行測試。 一、Express中…

mitmproxy配合Wireshark 抓包分析

Mitmproxy 是一款非常強大的 交互式 HTTP 代理 工具&#xff0c;它被廣泛應用于 Web 開發、API 調試、安全測試 等領域。與 Wireshark 側重于被動監聽網絡流量不同&#xff0c;Mitmproxy 更像一個 主動的中間人&#xff0c;可以攔截、檢查、修改和重放 HTTP/HTTPS 流量&#xf…