每天刷两道题——第四天

1.1最大子数组和

给一个整数数组 nums ,找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

动态规划

   动态规划也称为动态优化,把复杂问题分解为子问题,通过求解子问题,组合子问题的解从而得到整个问题的解。参考文章

动态规划适用于:
1.一个复杂问题的最优解由数个小问题的最优解构成,可以通过寻找子问题的最优解来得到复杂问题的最优解,这个特性又称为最优子结构(optimal substructure);例如:最短路径
2.子问题在复杂问题内重复出现,使得子问题的解可以被存储起来重复利用,这个特性又称为重叠子问题(overlapping subproblem)。例如:斐波拉契数列。

动态规划的无后效性

为了保证计算子问题能够按照顺序、不重复地进行,动态规划要求已经求解的子问题不受后续阶段的影响。这个条件也被叫做「无后效性」。换言之,动态规划对状态空间的遍历构成一张有向无环图,遍历就是该有向无环图的一个拓扑序。有向无环图中的节点对应问题中的「状态」,图中的边则对应状态之间的「转移」,转移的选取就是动态规划中的「决策」。

动态规划题解的步骤:状态定义、状态转移方程、初始化、输出、是否可以空间优化。

1.定义子问题:

子问题 1:以 −2 结尾的连续子数组的最大和是多少;
子问题 2:以 1 结尾的连续子数组的最大和是多少;
子问题 3:以 −3 结尾的连续子数组的最大和是多少;
子问题 4:以 4结尾的连续子数组的最大和是多少;
子问题 5:以 −1 结尾的连续子数组的最大和是多少;
子问题 6:以 2 结尾的连续子数组的最大和是多少;
子问题 7:以 1结尾的连续子数组的最大和是多少;
子问题 8:以 −5结尾的连续子数组的最大和是多少;
子问题 9:以 4 结尾的连续子数组的最大和是多少。

2.定义状态

d p [ i ] dp[i] dp[i]:表示以 n u m s [ i ] nums[i] nums[i]结尾 的 连续 子数组的最大和。

3.状态转移方程(子问题之间的联系)

n u m s [ i ] nums[i] nums[i]结尾的连续子数组与以 n u m s [ i − 1 ] nums[i - 1] nums[i1] 结尾的连续子数组只相差一个元素 n u m s [ i ] nums[i] nums[i]

假设数组 n u m s nums nums 的值全都严格大于 0,那么一定有 d p [ i ] = d p [ i − 1 ] + n u m s [ i ] dp[i] = dp[i - 1] + nums[i] dp[i]=dp[i1]+nums[i]

可是 d p [ i − 1 ] dp[i - 1] dp[i1]有可能是负数,于是分类讨论:
  如果 d p [ i − 1 ] > 0 dp[i - 1] > 0 dp[i1]>0,那么可以把 n u m s [ i ] nums[i] nums[i] 直接接在 d p [ i − 1 ] dp[i - 1] dp[i1] 表示的那个数组的后面,得到和更大的连续子数组;
  如果 d p [ i − 1 ] < = 0 dp[i - 1] <= 0 dp[i1]<=0,那么 n u m s [ i ] nums[i] nums[i] 加上前面的数 d p [ i − 1 ] dp[i - 1] dp[i1] 以后值不会变大。于是 d p [ i ] dp[i] dp[i] 「另起炉灶」,此时单独的一个 n u m s [ i ] nums[i] nums[i] 的值,就是 d p [ i ] dp[i] dp[i]

以上两种情况的最大值就是 d p [ i ] dp[i] dp[i]的值,写出如下状态转移方程:
d p [ i ] = { d p [ i − 1 ] + n u m s [ i ] if  d p [ i − 1 ] > 0 n u m s [ i ] if  d p [ i − 1 ] < = 0 dp[i]= \begin{cases} dp[i-1]+nums[i] &\text{if } dp[i-1]>0\\ nums[i] &\text{if } dp[i-1]<=0 \end{cases} dp[i]={dp[i1]+nums[i]nums[i]if dp[i1]>0if dp[i1]<=0

4.初始化

d p [ 0 ] dp[0] dp[0] 根据定义,只有 1 个数,一定以 n u m s [ 0 ] nums[0] nums[0]结尾,因此 d p [ 0 ] = n u m s [ 0 ] dp[0] = nums[0] dp[0]=nums[0]

5.输出

这个问题的输出是把所有的 d p [ 0 ] 、 d p [ 1 ] 、 … … 、 d p [ n − 1 ] dp[0]、dp[1]、……、dp[n - 1] dp[0]dp[1]……dp[n1]都看一遍,取最大值。

6.是否可以优化空间

一般的问题只要时间复杂度最优就可以。
空间复杂度 o n l i n e j u d g e online judge onlinejudge并不在意,只要使用的空间不太离谱,不要一上来就 i n t [ ] d p = n e w i n t [ I n t e g e r . M A X V A L U E ] int[] dp = new int[Integer.MAX_VALUE] int[]dp=newint[Integer.MAXVALUE]就好。

7.代码

class question1:def maxSubArray(self,nums):size=len(nums)pre=0  #初始状态res=nums[0]  #存储每个状态中的最大值for i in range(size):pre=max(nums[i],pre+nums[i]) #计算以nums[i]结尾的最大值res=max(res,pre)return res
q = question1()
print(q.maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))       

1.2任意子数组和的绝对值的最大值

数组 [ n 1 , n 2 , n 3 , . . . , n r − 1 , n r ] 的和的绝对值为 a b s ( n 1 + n 2 + n 3 + . . . + n r − 1 + n r ) 数组[n_1,n_2,n_3,...,n_{r-1},n_r]的 和的绝对值 为abs(n_1+n_2+n_3+...+n_{r-1}+n_r) 数组[n1,n2,n3,...,nr1,nr]的和的绝对值为abs(n1+n2+n3+...+nr1+nr)

其中abs()为取绝对值,定义如下:
1.如果 x 是负整数,那么 a b s ( x ) = − x abs(x) = -x abs(x)=x
2.如果 x 是非负整数,那么 a b s ( x ) = x abs(x) = x abs(x)=x

请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该最大值 。子数组是数组中的一个连续非空序列。

输入:nums = [2,-5,1,-4,3,-2]
输出:8
解释:子数组 [-5,1,-4] 和的绝对值最大,为 abs(-5+1-4) = abs(-8) = 8 。

nums 中 和的绝对值 最大的任意子数组可能是这个数组的子数组最大和的绝对值,也可能是这个数组的子数组最小和的绝对值,按照1.1的动态规划思路,求取数组的子数组最大和和子数组最小和。

class question1:def maxAbsoluteSum(self,nums):preMax,preMin=0,0resMax,resMin=nums[0],nums[0]for i in range(len(nums)):preMax=max(nums[i],nums[i]+preMax)resMax=max(resMax,preMax)preMin = min(nums[i], nums[i] + preMin)resMin = min(preMin, resMin)return max(abs(resMax),abs(-resMin))q = question1()
print(q.maxAbsoluteSum([2,-5,1,-4,3,-2]))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win系统微软输入法踩坑之输入法

例如&#xff1a;字母间距变宽 或者打字总是繁体等等 字母变宽是因为快捷键误触切换成了全角字符。。 立马打开输入法设置界面进行相关设置&#xff08;你要解决的输入法问题都可以在这里得到解决&#xff09;&#xff1a;

LED恒流驱动芯片:700V高压线性恒流选型一览表

LED恒流驱动芯片是一种专门用于LED照明产品的电子元件&#xff0c;它能够实现LED的恒流驱动&#xff0c;从而保证LED灯具在工作过程中稳定的亮度和电流输出。其中&#xff0c;700V高压线性恒流是LED恒流驱动芯片的一个重要特性&#xff0c;下面就让我们来详细了解一下。 SM2253…

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃&#xff0c;报错&#xff1a;Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃&#xff0c;报错&#xff1a;Library not loaded: rpath/Ap…

RSA非对称加密学习

设计方案&#xff1a; 单位生成密钥对&#xff1a; 每个单位&#xff08;A、B、C、D等&#xff09;生成自己的 RSA 密钥对&#xff0c;包括一个私钥和一个对应的公钥。 A单位加密数据&#xff1a; 单位A作为数据加密方&#xff0c;使用其他单位的公钥对数据进行加密。 其他单…

新年新计划,羊大师教你如何实现个人目标与成长

新年新计划&#xff0c;羊大师教你如何实现个人目标与成长 新的一年已经到来&#xff0c;这是一个神奇的时刻&#xff0c;一个全新的开始&#xff0c;也是实现自己目标与成长的最佳时机。在这个瞬息万变的世界中&#xff0c;我们总是被忙碌的生活所迷失&#xff0c;然而我们需…

Reservoir sampling algorithm--蓄水池抽样算法的理解

一、算法代码&#xff1a; def reservoir(num_seen_examples: int, buffer_size: int) -> int:"""Reservoir sampling algorithm.:param num_seen_examples: the number of seen examples:param buffer_size: the maximum buffer size:return: the target i…

springboot/spring cloud 手动控制事务提交

1、背景&#xff1a;定时器定时从数据库中拉取数据进行分组处理&#xff0c;每一组如果有任意一个异常导致失败&#xff0c;该组操作事务只能回滚。所以在循环中每一次大循环是一个事务&#xff0c;大循环中的其它小循环中任意一个异常都会回滚处理。 2、service中引入spring的…

2023年度回顾:怿星科技的转型与创新

岁月不居&#xff0c;时节如流。随着2023年的落幕&#xff0c;怿星科技在这一年中不仅实现了自身的转型&#xff0c;还在技术创新、产品研发、行业合作和人才培养等方面取得了显著的成就。这一年&#xff0c;怿星科技正式完成了从服务型公司向产品型公司的战略转变&#xff0c;…

Delphi6函数大全5-SysUtils.pas

Delphi6函数大全5-SysUtils.pas 首部 function InquireSignal(RtlSigNum: Integer): TSignalState; $[SysUtils.pas 功能 <NULL> 说明 Kylix函数 参考 <NULL> 例子 <NULL> ━━━━━━━━━━━━━━━━━━━━━ 首部 procedure A…

为什么选择 IBM LSF?

IBM Spectrum Computing 推出了全面的软件定义基础架构解 决方案产品组合&#xff0c;从而优化资源利用率以缩短成果实现时间并 降低成本&#xff0c;以高效地交付 IT 服务。IBM Spectrum Computing 解决方案非常适合技术和 HPC 应用&#xff0c;旨在简化和加速高性能 仿真和分…

Windows本地如何部署Apache服务器搭配内网穿透实现无公网IP远程访问?

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

【Kotlin】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…

深度学习|3.6 激活函数 3.7 为什么需要非线性激活函数

激活函数 主要有sigmoid函数、tanh函数、relu函数和leaky relu函数 tanh函数相比sigmoid函数是具有优势的&#xff0c;因为tanh函数使得输出值的平均值为0&#xff0c;而sigmoid函数使得输出值的平均值为1/2&#xff0c;对下一层来说tanh输出的0更好进行处理。 激活函数tanh…

# .NET Framework中使用命名管道进行进程间通信

.NET Framework中使用命名管道进行进程间通信 在.NET应用程序中&#xff0c;进程间通信&#xff08;IPC&#xff09;是一项常见需求。命名管道提供了一种高效、可靠的方式来在独立运行的进程之间传输数据。本文将展示如何在.NET Framework环境下创建一个WinForms管道客户端应用…

DIA数皆智能客户体验管理CEM获伊利“健康+AI”生态创新大奖

DIA数皆智能客户体验管理CEM获伊利“健康AI”生态创新大奖 数皆智能再获殊荣&#xff01; 北京&#xff0c;2023年12月26日 — 在全球瞩目的伊利集团“健康AI”生态创新大赛中&#xff0c;上海数皆智能技术有限公司大放异彩&#xff0c;其创新领先的“智能化客户体验管理CEM&a…

置顶> 个人学习记录一览

个人学习记录一览表 写个说明   知识学的好&#xff0c;不如笔记记得好&#xff0c;知识点的遗忘在所难免&#xff0c;这里记录我个人的学习过程&#xff0c;以备后面二次学习使用。 Linux 操作系统 Linux 操作系统 001-介绍 Linux 操作系统 002-VMware Workstation的相关操…

第19届楚天春晚在九省通衢大武汉闪亮登场

——中国明星后代女子歌舞团刘亦菲等兼任形象大使 2024年新年伊始&#xff0c;一场以繁荣中国传统文化为主旨的“楚天春晚”全国文旅活动在湖北武汉拉开帷幕&#xff01;以“文化强省&#xff0c;旅游大省”为神州特色的联合国世界品牌之都&#xff0c;在辞旧迎新的早春来临之…

kubeadm来快速搭建一个K8S集群

二进制搭建适合大集群&#xff0c;50台以下的主机 kubeadm更适合中下企业的业务集群 我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群…

RocketMQ 生产者源码分析:DefaultMQProducer、DefaultMQProducerImpl

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

Python 资源大全中文版

文末有链接 资源列表 环境管理 管理 Python 版本和环境的工具 p&#xff1a;非常简单的交互式 Python 版本管理工具。 pyenv&#xff1a;简单的 Python 版本管理工具。 Vex&#xff1a;可以在虚拟环境中执行命令。 virtualenv&#xff1a;创建独立 Python 环境的工具。 …