首页 > 其他分享 >最大多子段和问题

最大多子段和问题

时间:2024-04-25 15:22:05浏览次数:24  
标签:最大 int res 元素 问题 字段 序列 多子 指针

因为本人觉得2024年蓝桥杯的最后一题属于此类别,所以在此总结以下。且这个问题困惑我许久,终于于一个下午“顿悟”(勉勉强强理解半分)
部分思路借鉴于csdn;日月火山
题目描述:给定一个包含 K个整数的序列 {N1,N2,…,NK}。
连续子序列定义为 {Ni,Ni+1,…,Nj}
,其中 1≤i≤j≤K
最大子序列是指序列内各元素之和最大的连续子序列。

例如,给定序列 {−2,11,−4,13,−5,−2},它的最大子序列为 {11,−4,13},其各元素之和为 20。

现在你需要求出最大子序列的各元素之和。

这里的问题就是一段和,我本来以为这个题目可以用双指针去解决。

写题解的时候才发现不行。个人觉得是因为没有单调性,就像例子中给出来的子序列,我想维护这个连续序列和但是这个值不是单调的,比如和从11走到-4的时候,和会被更新,但是紧接着又增大了。这就破坏了双指针的单调性。(感觉·对双指针的理解不是很透彻 QAQ)

也就是说这个序列和的性质应该与每个元素所绑定,这个时候就要记录以下以每个元素结尾的最大字段和的位置。定义以此为结尾的集合数组,dp[i]指的是以a[i]结尾的最大字段和。思路很想最长上升子序列说思路。至于为什么这样定义可以解决上面双指针的问题呢。先贴个代码

#include<iostream>

using namespace std;

int main()
{
//····处理输入
  dp[i]=max(dp[i-1]+a[i],a[i]); 
}

在脑海中模拟以下这个过程,类似于双指针的过程,但是又不是那么像。dp[i-1]就是以a[i-1]为结束的最大字段和,如果加上之后比a[i]单独成组要大,那么就把这个值加上。我丢,这里我有觉得双指针可以做了。

//·····
     int i=0;
     int res=0,sum=-100000;
     while(i<n)
     {
         i++;
         if(res+a[i]>a[i])
         {
             res+=a[i];
         }else res=a[i];
    sum=max(sum,res);
     }

这里一直搞混了更新的过程,不是res在降低(遇到负值)的时候就更新res,而是在新的元素假如序列比单独的一个元素的和要小的时候才要更新元素。
然而,双指针没法解决多子段和的问题。
这里就要添加一个新的维度,类似分组背包。
原本只是一个组,就是一个子序列,现在是多组,就有多个子序列。所以f[i][j]就标识以第j元素结尾,i字段的的最大字段和。
代码如下:

#include<iotream>

using namespace std;

int main()
{
int ans=-10000;
   for(int i=1;i<=m;i++)
{
    for(int j=i;j<=n;j++)
   {
        f[i][j]=d[i][j-1]+a[i];  //接在前一个组的后面
        for(int k=j-1;k>=i-1;k--)
         {
         f[i][j]=max(f[i][j],f[i-1][k]+a[j]);
         }
   }
     if(i==m) ans=max(ans,f[i][j]);  //这里的内层循环每做一次都要更新一下答案,因为不晓得是以哪个作为元素的结尾。
  }
}

画表格以理解。这里我觉得最难得就是理解循环的执行过程,表格是一个很好的方法。

标签:最大,int,res,元素,问题,字段,序列,多子,指针
From: https://www.cnblogs.com/wl511/p/18157807

相关文章

  • 性能问题分析优化实践案例
    星球同学问了这样一个性能分析的问题:他们有一个地图服务,数据都存储在同一个sqlserver实例中,访问量过高导致服务挂了,开发的解决方案是将地图服务的内存从4G升级到8G,问题就解决了。她的问题是开发的这种解决办法是否是最优解,有没有更好的解决方案。由于我对他们的系统架构......
  • git命令下,mac环境下载依赖相关报错问题解决方案
    1.安装fundry框架curl-Lhttps://foundry.paradigm.xyz|bash2.写入环境变量source/Users/xx/.bashrc3.foundryup问题1报错:致命错误:无法访问'https://github.com/foundry-rs/forge-std解决方案:设置hosts文件:添加指定url的ip地址:140.82.112.4github.com185.1......
  • 记录一个小问题
    引发错误结果的代码:classSolution{List<List<Integer>>result=newArrayList<>();LinkedList<Integer>path=newLinkedList<>();publicList<List<Integer>>combine(intn,intk){backTracking(n,k,......
  • 前端调用DRI后端API出现跨域资源共享(CORS)问题解决办法
    目录1.引言2.跨源资源共享和实现方法3.在Django项目中配置django-cors-headers库Reference1.引言在进行后端API开发时,有时会遇到“跨域资源共享(CORS)请求...被阻止“的错误,如图1所示。本文讲解如何在使用DRF(DjangoRESTFramework)的后端API开发项目中解决这个问题。Ac......
  • java多模块项目依赖问题
    eg:b项目依赖a项目 a项目中的pom文件 注意全是自定义的<groupId>:通常表示项目所属的组织或公司的反向域名。这是为了保证全球唯一性<artifactId>:是项目的名称。这通常是项目的简单名称,它应该清晰地描述项目的内容。<version>:是项目的版本号。 b项目中的pom文件 ......
  • 大型企业不同安全域文件交换,常见方式的优势与问题对比
    现在越来越多的企业通过对网络进行物理或逻辑隔离,将内部网络与外部网络隔离开来,从而限制非法访问和恶意渗透,防止敏感数据泄露和恶意代码的传播,提高网络安全性。对于大型企业而言,将网络分为内外网并不足以满足安全管控的需求,它们会在内部再分割不同的安全域,如黄区、绿区、红区;如生......
  • dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之
    本文将记录一个dotnet的已知问题。当自己不小心在方法上不正确标记了MethodImplAttribute特性时,错误选择了MethodImplOptions.InternalCall参数,那将会在运行的过程在,在此类型被访问之前就抛出了System.TypeLoadException异常,错误信息是Internalcallmethodwithnon_NUL......
  • WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题
    本文将和大家介绍我所在的团队开源的ManipulationDemo工具。通过ManipulationDemo工具可以提升调试设备触摸失效的效率此工具在GitHub上完全开源,请看https://github.com/dotnet-campus/ManipulationDemo/软件界面效果大概如下可以显示接收到的Win32消息、当前的触摸......
  • 记 dotnet 8.0.4 修复的 WPF 的触摸模块安全问题
    本文记录dotnet8.0.4版本修复的WPF的触摸模块安全问题,此问题影响所有的.NET版本,修复方法是更新SDK和运行时宣布安全漏洞地址:https://github.com/dotnet/wpf/issues/9003安全漏洞宣布地址:https://github.com/dotnet/announcements/issues/303漏洞代号:CVE-2024-21409......
  • 抖音的倒水问题, 计算机bfs求解
    暴力求解bfs方法.并且找到的一定是最少步骤问题:抖音上面又来了一个倒水游戏例子:3个杯子,容量12,9,5上来12是满的.然后都没有刻度只能倒到一个满这种倒法,然后最后希望倒出2个6ml的.#抖音上面又来了一个倒水游戏#例子:3个杯子,容量12,9,5上来12是满的.然......