Python 動態規劃(DP)套路總結

Python 動態規劃(DP)套路總結

在解決算法問題時,動態規劃(DP) 是一種非常常見的優化技巧,它可以通過保存子問題的結果來避免重復計算,從而減少時間復雜度。Python 提供了非常方便的語法特性,使得實現動態規劃變得相對簡單。下面是一些常見的 Python 語法DP 解題套路

1. Python 語法和技巧

1.1 列表初始化

在 Python 中,動態規劃通常需要一個數組來存儲子問題的解,常見的初始化方法有:

  • 一維數組

    dp = [0] * n  # 初始化一個長度為 n 的數組,元素均為 0
    
  • 二維數組

    dp = [[0] * m for _ in range(n)]  # 初始化一個 n x m 的二維數組,元素均為 0
    
  • 處理邊界情況
    如果問題涉及到無效值(例如負無窮),可以初始化為非常小的數字:

    dp = [-float('inf')] * n  # 初始化為負無窮
    

1.2 枚舉排列

  • 枚舉排列:通常用于動態規劃中,確定所有的選擇路徑:

    for i in range(n):for j in range(i, n):  # 遍歷子數組# 在這里進行狀態轉移
    
  • 利用索引生成排序后的順序

    sorted_idx = sorted(range(len(arr)), key=lambda i: arr[i])  # 排序并記錄原始索引
    

2. 動態規劃(DP)解題套路

2.1 狀態定義

首先,需要定義一個或多個狀態,表示每個子問題的結果。常見的狀態定義如下:

  • dp[i] 表示前 i 個元素的最大和或最小值
  • dp[i][j] 表示在第 i 個位置選擇了 j 種操作后的最優解
  • 對于某些題目,可能需要額外記錄其他信息,如最大或最小值、索引等。

2.2 狀態轉移方程

根據題目要求,寫出從一個狀態轉移到另一個狀態的遞推公式。一般來說,轉移方程會根據前一個狀態的結果來更新當前狀態。

2.3 邊界條件

動態規劃通常從小的子問題開始,需要明確邊界條件:

  • dp[0] 可能是初始化的最小值。
  • dp[1] 可能是初始值或第一個元素的特殊處理。

2.4 最終解的選擇

在動態規劃的過程中,我們最終希望找到全局最優解(例如最大值或最小值)。通常,我們需要通過 max(dp)min(dp) 來獲取結果。


3. 題目解析與動態規劃解法

題目:1186. 刪除一次得到子數組最大和

題目描述

給定一個整數數組 arr,返回它的某個非空子數組(連續元素)在執行一次可選的刪除操作后,所能得到的最大元素總和。換句話說,你可以從原數組中選出一個子數組,并可以決定要不要從中刪除一個元素(只能刪一次哦),刪除后該子數組中至少應當有一個元素。

示例
arr = [1,-2,0,3]
輸出: 4

解釋:

  • 我們可以選擇子數組 [1, -2, 0, 3],刪除 -2,得到 [1, 0, 3],最大和為 4
解法思路

對于這個問題,我們可以使用 動態規劃(DP) 來處理。考慮兩種情況:

  1. 不刪除任何元素 的情況下,子數組的最大和。
  2. 刪除一個元素后,子數組的最大和。

1. 定義狀態

  • dp[i][0]:表示到第 i 個元素為止,不刪除任何元素時的最大和。
  • dp[i][1]:表示到第 i 個元素為止,刪除一個元素后的最大和。

2. 狀態轉移方程

  • dp[i][0]:可以選擇加入當前元素,或者從當前元素開始一個新的子數組:
    dp[i][0] = max(arr[i], dp[i-1][0] + arr[i])
    
  • dp[i][1]:可以選擇刪除當前元素,或者刪除前一個元素并加上當前元素:
    dp[i][1] = max(dp[i-1][0], dp[i-1][1] + arr[i])
    

3. 邊界條件

  • dp[0][0] = arr[0],表示子數組只有第一個元素的情況。
  • dp[0][1] = -inf,表示第一個元素不能刪除,因為至少要保留一個元素。

4. 最終解

我們需要考慮兩種情況的最大值:

  • dp[i][0] 表示不刪除元素的最大和。
  • dp[i][1] 表示刪除一個元素后的最大和。

最終的解是 max(max(dp[i][0] for i in range(n)), max(dp[i][1] for i in range(n)))
在這里插入圖片描述

代碼實現
class Solution:def maximumSum(self, arr: List[int]) -> int:n = len(arr)# 初始化 dp 數組,初始值為負無窮dp = [[-2e9, -2e9] for _ in range(n)]# 初始化第一個元素的情況dp[0][0] = arr[0]dp[0][1] = float('-inf')  # 刪除第一個元素不合法# 動態規劃遍歷for i in range(1, n):dp[i][0] = max(arr[i], dp[i - 1][0] + arr[i])  # 不刪除dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + arr[i])  # 刪除一個元素# 返回最大結果return max(max(dp[i][0] for i in range(n)), max(dp[i][1] for i in range(n)))
解析:
  1. 初始化:我們初始化了 dp 數組,并為第一個元素設定了邊界條件。
  2. 狀態轉移:我們通過遍歷 arr 數組,逐步計算 dp[i][0]dp[i][1],表示不刪除元素和刪除元素后的最大和。
  3. 返回結果:最后返回 dp 數組中最大的值,即為子數組的最大和。

時間復雜度與空間復雜度:

  • 時間復雜度O(n),我們只遍歷了一次數組,并進行常數時間的計算。
  • 空間復雜度O(n),需要一個大小為 n 的動態規劃數組。

總結

動態規劃(DP)是解決子問題最優解的強大工具。在此題中,我們利用了動態規劃的狀態定義轉移方程來解決刪除一次元素后的子數組最大和問題。在處理此類問題時,理解狀態定義與轉移方程至關重要,它能夠幫助我們高效地得出最終的最優解。
兩種狀態 沒有行使權力的最大數組和 行使權力后的最大數組和
沒有行使權力可以另起爐灶一個新的或者繼承之前的
行使權力的可以繼承之前的,或者行使權力不刪集成沒有行使權力的

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

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

相關文章

ESP32驅動OV3660攝像頭實現yoloV5物體分類(攝像頭支持紅外夜視、邊緣AI計算)

目錄 1、傳感器特性 2、硬件原理圖 3、驅動程序 ESP32-S3 AI智能攝像頭模塊是一款專為智能家居和物聯網應用打造的高性能邊緣AI開發模組。它集成了攝像頭、麥克風、音頻功放、環境光傳感器和夜視補光燈,無需依賴云端即可實現本地化AI推理。 憑借TensorFlow Lite、YOLO和O…

RReadWriteLock讀寫鎖應用場景

背景 操作涉及一批數據,如訂單,可能存在多個場景下操作,先使用讀鎖,從redis緩存中獲取操作中數據 比如 關閉賬單, 發起調賬, 線下結算, 合并支付 先判斷當前操作的數據,是否在…

網絡安全高級軟件編程技術 網絡安全 軟件開發

安全軟件開發入門 軟件安全問題 有趣的《黑客帝國》終極解釋: 《黑客帝國》故事里面的人物關系,就像電腦里面的各種程序的關系一樣: 電腦里面的系統程序:Matrix; 病毒程序:以Neo為首的人類; 防病…

蘋果商店上架流程,app上架發布流程

蘋果商店地址 https://appstoreconnect.apple.com/login 其他地址:開發 - Apple Developer 1.更新代碼 將項目的代碼更新到最新,更新成功后右下角會給出提示 2.打開模擬器 鼠標右鍵可以選擇設備(Device) 3.測試運行 如下圖可以看到已經識別到設備了,點擊運行即可,運行到模…

正點原子[第三期]Arm(iMX6U)Linux移植學習筆記-2.1 uboot簡介

前言: 本文是根據嗶哩嗶哩網站上“Arm(iMX6U)Linux系統移植和根文件系統構鍵篇”視頻的學習筆記,在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。 引用: …

Better-SQLite3 參數綁定詳解

Better-SQLite3 參數綁定詳解 在使用 better-sqlite3 進行數據庫操作時,參數綁定是一個非常重要的概念。它不僅提高了代碼的可讀性和安全性,還能有效防止 SQL 注入攻擊。本文將詳細介紹如何在 better-sqlite3 中使用匿名參數和命名參數,并展…

C++編程:進階階段—4.1封裝

C面向對象的三大特性:封裝、繼承、多態 具有相同性質的對象,抽象為類 4.1 封裝 封裝的意義:將屬性和行為作為一個整體,表現生活中的事物,并將屬性和行為加以權限控制。 4.1.1 類的定義及實例化對象 語法&#xff…

運行OpenManus項目(使用Conda)

部署本項目需要具備一定的基礎:Linux基礎、需要安裝好Anaconda/Miniforge(Python可以不裝好,直接新建虛擬環境的時候裝好即可),如果不裝Anaconda或者Miniforge,只裝過Python,需要確保Python是3.…

spring boot + vue 搭建環境

參考文檔:https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建環境 一、瀏覽器二、jd…

MPPT與PWM充電原理及區別詳解

MPPT(最大功率點跟蹤)和PWM(脈寬調制)是太陽能充電控制器中常用的兩種技術,它們在原理、效率和適用場景上有顯著區別。以下是兩者的詳細對比: 1. 工作原理 PWM(脈寬調制) 核心機制…

slam學習筆記9---ubuntu2004部署interactive_slam踩坑記錄

背景:interactive_slam是一款可用于離線優化點云地圖算法。部署安裝容易出問題,這里記錄一下。 一、安裝基本流程 絕大部分跟著readme走,g2o安裝使用apt安裝 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…

視覺圖像處理

在MATLAB中進行視覺圖像處理仿真通常涉及圖像增強、濾波、分割、特征提取等操作。以下是一個分步指南和示例代碼,幫助您快速入門: 1. MATLAB圖像處理基礎步驟 1.1 讀取和顯示圖像 % 讀取圖像(替換為實際文件路徑) img = imread(lena.jpg); % 顯示原圖 figure; subplot(2…

用java如何利用jieba進行分詞

在Java中使用jieba進行分詞,可以借助jieba的Java版本——jieba-analysis。jieba-analysis是一個基于jieba分詞算法的Java實現,支持精確模式、全模式和搜索引擎模式等多種分詞方式。 以下是使用jieba-analysis進行分詞的詳細步驟和示例代碼: …

【含文檔+PPT+源碼】Python爬蟲人口老齡化大數據分析平臺的設計與實現

項目介紹 本課程演示的是一款Python爬蟲人口老齡化大數據分析平臺的設計與實現,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Python學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本…

【A2DP】SBC 編解碼器互操作性要求詳解

目錄 一、SBC編解碼器互操作性概述 二、編解碼器特定信息元素(Codec Specific Information Elements) 2.1 采樣頻率(Sampling Frequency) 2.2 聲道模式(Channel Mode) 2.3 塊長度(Block Length) 2.4 子帶數量(Subbands) 2.5 分配方法(Allocation Method) 2…

Android雙親委派

下面是一份 Android 類加載器雙親委派機制的時序圖示例,描述了當應用調用 loadClass() 時,各個加載器之間的委派過程。 #mermaid-svg-rBdlhpD2uRjBPiG8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

記錄小白使用 Cursor 開發第一個微信小程序(二):創建項目、編譯、預覽、發布(250308)

文章目錄 記錄小白使用 Cursor 開發第一個微信小程序(二):創建項目、編譯、預覽、發布(250308)一、創建項目1.1 生成提示詞1.2 生成代碼 二、編譯預覽2.1 導入項目2.2 編譯預覽 三、發布3.1 在微信開發者工具進行上傳3…

Linux系統管理二

目錄 一.遠程連接管理服務SSH 1.1 了解服務端和客戶端 1.2 了解端口號的設定 1.3 了解ssh服務的作用 1.4 ssh搭建服務 二.netstat 2.1 netstat簡介 2.2 netstat命令參數 2.3 常用命令參考 三.進程的檢測與控制 3.1 管道 3.1.1 什么是管道 3.1.2 管道的分類 3.1.3…

【Recon】Git源代碼泄露題目解題方法

CTF中Git源代碼泄露題目解題方法 1. 確認存在.git目錄泄露2. 下載完整的.git目錄3. 恢復Git倉庫歷史4. 查找Flag的常見位置5. 處理不完整的.git目錄6. 其他技巧示例流程 在CTF中遇到Git源代碼泄露題目時,通常可以通過以下步驟解決: 1. 確認存在.git目錄泄…

字符串 反轉函數reverse() 的錯誤用法

回文字符串 題目描述 如果一個字符串逆序后與正序相同,那么稱這個字符串為回文字符串。例如abcba是回文字符串,abcca不是回文字符串。 給定一個字符串,判斷它是否是回文字符串。 輸入描述 一個非空字符串(長度不超過 50&#…