【动态规划专栏】专题四:子数组问题--------最大子数组和环形子数组的最大和

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:动态规划专栏
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题四

  • 题目一来源:
  • 题目1描述
  • 算法原理
    • 1.状态表示
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 代码实现
  • 题目二来源
  • 题目二描述
  • 算法原理
    • 1.状态表示
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 代码实现

题目一来源:

本题来源为:

Leetcode 53. 最大子数组和

题目1描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。
在这里插入图片描述

算法原理

1.状态表示

经验+题目要求
在这里插入图片描述

对于本题而言就是:

dp[i]表示:以i位置为结尾时的所有子数组中的最大和

2.状态转移方程

分两种情况:
i位置本身自己为一个子数组
i位置与之前结合为一个子数组
在这里插入图片描述
在这里插入图片描述

因此状态方程为:

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

3.初始化

在这里插入图片描述

4.填表顺序

从左往右

5.返回值

整个dp表里的最大值

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution
{
public:
    int maxSubArray(vector<int> &nums)
    {
        //创建dp表
        int n=nums.size();
        vector<int> dp(n+1);
        //初始化
        //填表
        int ret=INT_MIN;
        for(int i=1;i<=n;i++)
        {
            dp[i]=max(nums[i-1],dp[i-1]+nums[i-1]);
            ret =max(ret,dp[i]);
        }
        //返回值
        return ret;
    }
};

题目二来源

本题来源为:

Leetcode918. 环形子数组的最大和

题目二描述

给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。

环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。

子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], …, nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。
在这里插入图片描述

算法原理

我们可以先分析一下:
在这里插入图片描述
这道题在最大子数组上加了可以成环的条件。

解决这道题的关键就是可以将这道题转化成最大子数组和的问题。
子数组成环会有两种情况:

  1. 最大的子数组在中间,我们就要可以直接用最大子数组和的问题解题思路
  2. 最大子数组在首尾相连,我们可以反过来,计算中间那一部分也就是最小子数组和,最后用总和一减就是最大子数组和

1.状态表示

经验+题目要求

在这里插入图片描述

对于本题而言就是:

f[i]表示:以i位置为结尾时的所有子数组中的最大和
g[i]表示:以i位置为结尾时的所有子数组中的最小和

2.状态转移方程

分两种情况:
i位置本身自己为一个子数组
i位置与之前结合为一个子数组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

因此状态方程为:

int x=nums[i-1];
f[i]= max(x,x+f[i -1]);
fmax = max(fmax,f[i]);
g[i]=min(x,x+ g[i-1]);
gmin = min(gmin, g[i]);
sum += X;

3.初始化

在这里插入图片描述

4.填表顺序

从左往右

5.返回值

在这里插入图片描述

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int maxSubarraySumCircular(vector<int>& nums) 
    {
         //创建dp表
        int n=nums.size();
        vector<int> f(n+1);
        vector<int> g(n+1);
        int fmax=INT_MIN,gmin=INT_MAX,sum =0;
        //初始化
        //填表
       for(int i=1;i<=n;i++)
       {
           int x=nums[i-1];
           f[i]= max(x,x+f[i -1]);
           fmax = max(fmax,f[i]);
           g[i]=min(x,x+ g[i-1]);
           gmin = min(gmin, g[i]);
           sum += x;
       }
        //返回值
        return sum==gmin?fmax:max(fmax,sum-gmin);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openEuler2203 LTS安装VMware WorkStation Pro 17并远程桌面连接Linux服务器

openEuler 2203 LTS默认只有命令行&#xff0c;没有GUI图形界面&#xff0c;在其中安装VMware WorkStation需要有图形界面的支持。这里以安装深度的DDE桌面环境&#xff0c;最后通过VNC远程桌面连接Linux服务器操作VMware WorkStation。 以下操作请保持网络能正常连接 1、安装…

【网站项目】679学生学籍管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

gitlab的使用

前一篇文章我们已经知道Git人人都是中心&#xff0c;那他们怎么交互数据呢&#xff1f; • 使用GitHub或者码云等公共代码仓库 • 使用GitLab私有仓库 目录 一、安装配置gitlab 安装 初始化 这里初始化完成以后需要记住一个初始密码 查看状态 二、使用浏览器访问&#xf…

瑞_VMware虚拟机安装Linux纯净版(含卸载,图文超详细)

文章目录 1 资源准备1.1 官方资源1.2 帮助资源 2 安装 VMware3 安装 CentOS 73.1 镜像 附&#xff1a;VMware删除已安装的操作系统 &#x1f64a; 前言&#xff1a;VMware虚拟机安装Linux纯净版 VMware版本&#xff1a;VMware Workstation 16.2.4Linux版本&#xff1a;CentOS 7…

Stable Diffusion 模型分享:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 A-Zovya RPG Artist Tools 模型是一个针对 RPG 训练的一个模型&#xff0c;可以生成一些 R…

如何使用eXtplorer部署个人云存储空间并实现公网访问内网数据

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

内衣洗衣机哪个好用?顶流爆款内衣洗衣机推荐

大家都知道&#xff0c;内衣裤一天不洗&#xff0c;就会滋生很多细菌&#xff0c;很多女生既要忙工作又要忙家务&#xff0c;衣服总会积攒到一堆再去清洗&#xff0c;在潮湿的天气&#xff0c;这样甚至会有发霉的情况出现&#xff0c;而传统的用手洗贴身衣物&#xff0c;看起来…

冷链物流追踪:Java与MySQL的协同实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Unity NavMesh 清除不可行走区域

通常场景中物体设置为static或Navigation Static后&#xff0c;打开Navigation使用默认设置烘焙NavMesh&#xff0c;模型顶部和底部会出现蓝色网格&#xff0c;但其中有部分属于不可能到达区域&#xff0c;如下图 本文介绍两种可去掉NavMesh中不需要网格的方法&#xff1a; 方…

无痛法门,助力学习

**注&#xff1a;**本文摘自一位网友“我就是贺生啊”&#xff0c;博主觉得很有道理&#xff0c;便想记录下来分享给大家。仅个人想法&#xff0c;谨慎参考&#xff0c;也欢迎大家说出自己的想法。 引言 在我们学习新知识的时候&#xff0c;会觉得很痛苦&#xff0c;制定学习…

软件设计不是CRUD(12):低耦合模块设计理论——业务抽象:模块分层操作

接上文《软件设计不是CRUD(11):低耦合模块设计理论——业务抽象:规划模块分层》 3、模块的边界 上篇文章的内容基本上说清楚了模块为什么要进行分层设计,以及模块分层设计所遵循的基本原则。本节内容我们就来讨论一下如何实际进行模块的分层规划。前文已经提到,在完成从…

机器人内部传感器阅读笔记及心得-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求&#xff0c;可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…

数字之美:探索人工智能绘画的奇妙世界

目录 引言AI绘画的定义与发展历程定义与发展历程AI绘画产品有哪些? AI绘画的应用领域设计与创意产业影视与游戏制作数字艺术与展览 AI绘画的基本原理与技术深度学习与神经网络生成对抗网络&#xff08;GAN&#xff09;风格迁移算法 AI绘画效果展示一只带着墨镜的小猫在高楼林立…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一&#xff0c;在国际灾害事故排名中位列第18位&#xff0c;根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计&#xff0c;在46起尾矿库泄漏事故中&#xff0c;由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…

家庭能耗监控系统

随着能源成本的不断上升和环保意识的增强&#xff0c;家庭能耗监控系统变得越来越重要。这种系统是智能家居技术的一部分&#xff0c;它使得家庭用户能够实时监视和管理其能源使用情况&#xff0c;从而达到节能减排的目的。 一、系统组成 家庭能耗监控系统通常由传感器、智能计…

FPGA_SD卡读写

一 SD卡 SD卡&#xff0c;安全数字卡&#xff0c;体积小&#xff0c;容量大&#xff0c;存储速度块&#xff0c;支持热插拔。 二 SD卡存储容量 SD卡类型协议规范容量等级SDSCSD1.0上限至2GBSDHCSD2.02GB至32GBSDXCSD3.032GB至2TB 三 SD卡速度等级 标志串列数据写入速度UHS…

Liunx 免费证书配置 带自动续期

安装完 nginx 之后 执行 yum install certbot 安装完后接着安装 python3-certbot-nginx 插件. 对于 Ubuntu/Debian 系统&#xff1a; sudo apt-get update sudo apt-get install certbot python3-certbot-nginx对于 CentOS/RHEL 系统&#xff1a; sudo yum install epel…

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有&#xff1a;1&#xff09;xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定&#xff1b;2&#xff09;Web请求参数绑定&#xff0c;在Spring MVC 中&#xff0c;Controller的方法参数通常会自…

【k近邻】Kd树构造与最近邻搜索示例

【k近邻】 K-Nearest Neighbors算法原理及流程 【k近邻】 K-Nearest Neighbors算法距离度量选择与数据维度归一化 【k近邻】 K-Nearest Neighbors算法k值的选择 【k近邻】 Kd树的构造与最近邻搜索算法 【k近邻】 Kd树构造与最近邻搜索示例 近邻法的实现需要考虑如何快速搜索个最…