什么是动态规划法?

简单说,动态规划(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…