動態規劃法 - 53. 最大子數組和

什么是動態規劃法?

簡單說,動態規劃(Dynamic Programming,簡稱 DP) 是一種**「把復雜問題拆解成小問題,通過解決小問題來解決大問題」**的方法。
核心思路有兩個:
1.拆分問題:把原問題拆成多個相似的「子問題」(比如求 “整個數組的最大子數組和” 可以拆 成 “以每個元素結尾的最大子數組和”)。
2.記住答案:用一個表格(或變量)記錄子問題的答案,避免重復計算(這一步叫「記憶化」)。

用動態規劃解決 “最大子數組和” 的標準思路

以 nums = [-2, 1, -3, 4] 為例:
1.定義子問題:設 dp[i] 為「以第 i 個元素結尾的最大子數組和」。

  • 比如 dp[0] 是 “以 -2 結尾的最大和” → 只能是 -2。
  • dp[1] 是 “以 1 結尾的最大和” → 要么單獨用 1,要么用 dp[0] + 1(即 -2 + 1 = -1),取大的那個 → 1。

2.找規律(狀態轉移方程):dp[i] = max(nums[i], dp[i-1] + nums[i])(要么從當前元素重新開始,要么接上前面的子數組)
3.計算所有子問題:

  • dp[0] = -2
  • dp[1] = max(1, -2+1) = 1
  • dp[2] = max(-3, 1-3) = -2
  • dp[3] = max(4, -2+4) = 4

4.求最終答案:所有 dp[i] 中的最大值 → 4。
我們現在用的方法,其實是動態規劃的 “升級版”
上面的標準思路需要一個 dp 數組來存所有子問題的答案(空間復雜度 O(n)),但我們可以優化:
觀察發現:計算 dp[i] 只需要前一個 dp[i-1] 的值,不需要整個數組。
所以可以用一個變量 sum 代替 dp 數組(sum 就代表當前的 dp[i]),這樣空間復雜度就降到了 O(1)。
這就是我們現在用的方法:

  • sum 等價于 dp[i](當前子問題的答案)。
  • sum = max(nums[i], sum + nums[i]) 就是狀態轉移方程。
  • res 用來記錄所有 sum 中的最大值(即最終答案)。

總結

  • 標準動態規劃:用數組存所有子問題答案,思路直觀,空間稍大。
  • 我們現在的方法:用單個變量代替數組,核心邏輯不變,是動態規劃的「空間優化版」。

題目

https://leetcode.cn/problems/maximum-subarray/description/?envType=study-plan-v2&envId=top-100-liked

給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 子數組是數組中的一個連續部分。
示例 1: 輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]輸出:6解釋:連續子數組 [4,-1,2,1] 的和最大,為
6 。 示例 2: 輸入:nums = [1]輸出:1 示例 3: 輸入:nums = [5,4,-1,7,8]輸出:23

題解

class Solution {public int maxSubArray(int[] nums) {// 把sum初始化為數組第一個元素int sum = nums[0];// 結果也初始化為第一個元素(因為最大和至少是它自己)int res = nums[0];// 從第二個元素開始遍歷(索引1)for (int i = 1; i < nums.length; i++) {// 同樣先判斷:之前的sum是否有用if (sum > 0) {// 有用就累加當前元素sum += nums[i];} else {// 沒用就從當前元素重新開始sum = nums[i];}// 更新最大和res = Math.max(res, sum);}return res;}
}

過程解讀(結合 “攢錢” 例子)

  • 初始狀態:手里先拿著第一天的錢 sum=-1(虧了 1 塊),歷史最多錢 res=-1。
  • 第二天(元素 2):之前手里是虧的(sum=-1),不如直接拿今天的 2 塊,sum 變成 2。歷史最多錢更新為 2。
  • 第三天(元素 - 3):手里有 2 塊(正數),雖然今天花了 3 塊,但還是加上試試,sum=2-3=-1。歷史最多錢還是 2(因為 - 1 < 2)。
  • 第四天(元素 4):手里是 - 1(虧的),直接拿今天的 4 塊,sum 變成 4。歷史最多錢更新為 4。
  • 第五天(元素 - 1):手里有 4 塊(正數),今天花 1 塊,加上后 sum=4-1=3。歷史最多錢還是 4(因為 3 < 4)。
    最終結果是 4,對應最大子數組 [4](或者理解為 “只拿第四天的錢最劃算”)。

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

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

相關文章

STM32CUBEMX配置stm32工程

1.新建工程2.選擇芯片3.配置各種片上外設和時鐘4.創建工程5.根據文件內容進行修改工程注意&#xff1a;最好根據工程規范來做&#xff0c;因為有時我們需要更改配置并重新生成&#xff0c;如果不按規范來會導致部分代碼會被系統清除&#xff0c;在工程中中有很多成對的BEGIN和E…

Day07 緩存商品 購物車

緩存菜品問題說明用戶端小程序展示的菜品數據都是通過查詢數據庫獲得&#xff0c;如果用戶端訪問量比較大&#xff0c;數據庫訪問壓力隨之增大。結果&#xff1a;系統響應慢&#xff0c;用戶體驗差實現思路通過 Redis 來緩存菜品數據&#xff0c;減少數據庫查詢操作。緩存邏輯分…

Jenkins(集群與流水線配置)

Jenkins&#xff08;集群與流水線配置&#xff09; Jenkins集群 集群化構建可以提升構建效率&#xff0c;也可以并發在多臺機器上執行構建。 安裝前提&#xff1a;內存至少512MB、Java 17 以上、Maven環境、Git環境 配置集群步驟 配置節點菜單新建節點查看節點配置狀態 新建完節…

深入剖析ROS參數服務器通信機制 ——共享全局數據的“云端倉庫”實現原理

?1. 核心概念&#xff1a;分布式數據共享容器? ?定位?&#xff1a;ROS參數服務器&#xff08;Parameter Server&#xff09;是ROS架構中的全局共享存儲系統&#xff0c;相當于機器人的“云端倉庫”。 ?作用?&#xff1a; 存儲多節點共享的靜態配置參數&#xff08;如機器…

21.AlexNet

雖然LeNet在手寫數字識別上取得了不錯的結果&#xff0c;但是他在對于更大的數據集效果就十分有限。 一方面&#xff0c;對于更大尺寸的圖像效果有限 另一方面&#xff0c;對于更多分類的任務效果有限 自LeNet后的十幾年&#xff0c;計算機視覺領域步入寒冬&#xff0c;神經網絡…

Shell腳本-條件判斷相關參數

一、前言在 Shell 腳本編程中&#xff0c;條件判斷 是實現流程控制的核心機制之一。無論是判斷文件是否存在、字符串是否相等&#xff0c;還是數值大小比較&#xff0c;都離不開條件判斷語句。本文將帶你全面掌握 Shell 腳本中與條件判斷相關的參數和語法&#xff0c;包括&…

何為“低空經濟”?

低空經濟&#xff08;Low-Altitude Economy&#xff09;是指以1000米以下空域&#xff08;部分場景可延伸至3000米&#xff09;為核心&#xff0c;以無人機&#xff08;UAV&#xff09;、電動垂直起降飛行器&#xff08;eVTOL&#xff09;、直升機、通航飛機等航空器為載體&…

線性代數 | 直觀理解一些概念

注&#xff1a;本文為 “線性代數 直觀理解概念” 相關合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 如有內容異常&#xff0c;請看原文。 直觀理解線性代數的一些概念 2015-03-06 Updated: 2015-05-09 本文介紹矩陣的一些相關概念的直觀理解&…

Spring AI 集成阿里云百煉平臺

Spring AI 集成阿里云百煉平臺 創建API key 在阿里云百煉平臺創建API key設置系統變量。阿里云百煉 api key 創建 API 參考 官方API地址&#xff1a;https://bailian.console.aliyun.com &#xff08;1&#xff09;在阿里云百煉控制臺&#xff0c;選擇API參考菜單。 API…

Codeforces Round 859 (Div. 4) A - D + F - G2 題解

Codeforces Round 859 (Div. 4) A - D F - G2 題解A. Plus or Minus&#xff08;800 分難度&#xff09; 思路&#xff1a; 直接 if - else 判斷。 參考代碼&#xff1a; #include<bits/stdc.h> using namespace std; void solve(){int a, b, c;cin >> a >&g…

【Java web】Servlet 詳解

一、什么是 Servlet&#xff1f;—— 你不知道的 "網頁服務員"想象你走進一家網紅書店&#xff08;比如 "在線 Java 書店"&#xff09;&#xff0c;想買一本《Java 編程思想》。你告訴前臺服務員你的需求&#xff0c;服務員去倉庫找書、包裝、收款&#xf…

數據庫Microsoft Access、SQL Server和SQLite三者對比及數據庫的選型建議

SQLite本質是代碼庫&#xff0c;Access是單文件桌面DB&#xff0c;SQL Server是正經的C/S架構數據庫。這就像比較自行車、家用轎車和卡車&#xff0c;完全不同的設計目標。 核心區別對比表特性Microsoft AccessSQL ServerSQLite類型桌面DBMS (文件型)客戶端/服務器 RDBMS嵌入式…

【C++】默認構造函數,參數化構造函數,拷貝構造函數,拷貝賦值運算符, 移動構造函數 ,移動賦值運算符

1. 默認構造函數 (Default Constructor) 作用&#xff1a; 無參創建對象 簽名&#xff1a; ClassName() 特點&#xff1a; ①無參數或所有參數都有默認值 ②若未聲明任何構造函數&#xff0c;編譯器自動生成&#xff08;空實現&#xff09; ③用于容器默認初始化&#xff08;如…

辦公效率提升指南:完成重復任務自動化

手動操作容易出錯&#xff0c;尤其是在處理大量數據或復雜文檔時。它將PDF轉換、Word處理、Excel操作、OCR識別等高頻功能融為一體&#xff0c;界面清爽無冗余&#xff0c;零廣告打擾&#xff0c;專注提升工作效率。它內置七大核心模塊&#xff1a;自動任務、系統工具、文件處理…

數字煉金術:當API工作流遇見AI客服—點石成金的智能革命!

目錄 引言 一、藍耘元生代MaaS平臺概述 1.1 藍耘平臺的API服務 1.2 藍耘平臺的優勢 二、初識藍耘元生代MaaS平臺—帶你深度體驗 2.1 從零開始——平臺注冊與環境搭建 2.2 藍耘平臺的優勢在哪里&#xff1f; 三、API工作流調用技巧與實踐 3.1 API工作流設計與調用流程 …

HackMyVM-Uvalde

目錄信息搜集漏洞利用權限提升信息搜集 主機發現 ┌──(kali?kali)-[~] └─$ nmap -sn 192.168.21.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-16 01:10 EDT Nmap scan report for dev.medusa.hmv (192.168.21.6) Host is up (0.00015s latency). MAC Addr…

「Java EE開發指南」如何使用MyEclipse中的Web Fragment項目?

開發者可以通過使用Web Fragment項目模塊化應用程序部署描述符&#xff0c;本文提供如何使用它們的必要信息。 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 通過使用Web Fragment項目&#xff0c;您的Web應用程序部署描述符可以模塊化&#xff0c;就像能夠模塊化…

redis的key過期刪除策略和內存淘汰機制

一、key的過期刪除策略 原由&#xff1a;一般情況下&#xff0c;在使用redis作緩存&#xff0c;對k設置過期時間&#xff0c;當過期時間到后&#xff0c;k還是占用內存的&#xff0c;并沒有從內存中移除。 1.定時刪除 在設置key的過期時間的同時&#xff0c;為該key創建一個定…

NVIDIA Nsight Deep Learning Designer使用

一、關于產品 1.1 產品介紹 NVIDIA Nsight Deep Learning Designer 是一款面向 AI 推理開發者的可視化建模與優化工具。它支持基于 ONNX 格式的神經網絡模型編輯、結構可視化、性能分析與 TensorRT 引擎導出&#xff0c;幫助用戶更高效地設計、調優和部署高性能推理模型。該工…

Android 常見100道面試題(完整版)

一、基礎組件與核心原理Activity 相關Q1&#xff1a;請描述 Activity 的完整生命周期&#xff0c;從創建到銷毀經歷哪些關鍵方法&#xff1f;A&#xff1a;Activity 完整生命周期包括&#xff1a;onCreate&#xff08;初始化&#xff09;→ onStart&#xff08;可見&#xff09…