当前位置: 首页 > news >正文

「动态规划」最大子数组和

力扣原题链接,点击跳转。

请在一个数组nums中找出一个子数组,使得这个子数组中所有元素的和最大。

你当然可以采取暴力枚举的方法,但是效率太低。这里我们用动态规划的思想来解决这个问题。首先确定状态表示:我们用dp[i]表示以i结尾的所有子数组的最大和。

接着推导状态转移方程。分类讨论:

  • 如果以i结尾的子数组只包含nums[i],那么和为nums[i]。
  • 如果以i结尾的子数组长度大于1,那么和为dp[i-1]+nums[i]。

所以,dp[i]=max(nums[i],dp[i-1]+nums[i])。

接着考虑初始化的问题。显然dp[0]=nums[0]。填表时应按照从左往右的顺序。最终应返回整个dp表中的最大值。

class Solution {
public:int maxSubArray(vector<int>& nums) {// 创建dp表int n = nums.size();vector<int> dp(n);// 初始化dp[0] = nums[0];// 从左往右填表for (int i = 1; i < n; i++){dp[i] = max(nums[i], dp[i-1] + nums[i]);}// 返回整个dp表的最大值return *max_element(dp.begin(), dp.end());}
};

当然,你也可以在填表的同时把最大值求了。

class Solution {
public:int maxSubArray(vector<int>& nums) {// 创建dp表int n = nums.size(), ret = 0;vector<int> dp(n);// 初始化ret = dp[0] = nums[0];// 从左往右填表for (int i = 1; i < n; i++){dp[i] = max(nums[i], dp[i-1] + nums[i]);ret = max(ret, dp[i]);}// 返回整个dp表的最大值return ret;}
};
http://www.lryc.cn/news/362217.html

相关文章:

  • 【LeetCode 130. 被围绕的区域】
  • 超市管理系统设计1——基本功能设计
  • 前端性能优化总结笔记
  • 51种企业应用架构模式详解
  • 零基础入门学习Python第二阶04SQL详解03
  • 【第二节】C/C++数据结构之线性表
  • 千帆 AppBuilder 工作流编排功能直播总结
  • Android百度人脸识别3.0配置
  • dolphinscheduler docker部署海豚mysql版本,docker重新封装正在运行服务为镜像
  • QAnything-1.4.01.4.1版本更新!使用指北!
  • 【ARM】Fusa Compiler 6.16 LTS的安全认证报告获取
  • 数据持久化第七课-URL重写与Ajax
  • 静态网页实现-人脸识别-案例(web)
  • ARM32开发——串口输入
  • 个人笔记--python用tanh画圆形,正方形,长方形(epsilon界面宽度)
  • 学习Java,stringbuilder用法
  • 16-云原生监控体系-rabbitmq_exporter监控 RabbitMQ-[部署Dashborad告警规则实战]
  • 四大运营商频段-2024
  • 260只出现一次的数字
  • 【高阶数据结构(八)】跳表详解
  • 用旧安卓手机当 linux 开发机
  • discuz如何添加主导航
  • [每日一练]患某种疾病的患者,正则表达式的匹配
  • PHP身份证识别接口、线上平台如何实现身份证实名认证功能?
  • 若依:mybatis查询的结果未映射到实体类报null
  • 成都百洲文化传媒有限公司电商服务可信吗?
  • 【递归、搜索与回溯】递归、搜索与回溯准备+递归主题
  • MVC前端怎么写:深入解析与实战指南
  • LINUX网络设置
  • 双指针解题