首页 > 其他分享 >最大子段和 or 最大子序和

最大子段和 or 最大子序和

时间:2022-11-11 22:34:46浏览次数:44  
标签:最大 nums 子段 负数 数组 序列 子序

老生常谈序列和串的区别

最长公共子序列和最长公共子串区别

最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别:

子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。

子串和子段,都要求连续

求最大子段(子序)和

意思就是,给定一个整数数组nums[],找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

输入: [-2,1,-3,4,-1,2,1,-5,4]

输出: 6

解释: 连续子数组[4,-1,2,1]的和最大,为6。

设有这样的一个数组:

{-2,-1,3,5,10,-2-,1,2,5,-2}

我们可以思考一下,最大的连续元素和,他们的不会让他们的和减小的负数

也就是说,当有前几个元素的和为负数的时候,后面的元素运算必定不会带上前面这个和为负数的子段

所以我们可以建立一个辅助数组MAX,存储他们的局部最优解

 

 

第一个开始,他自己本身就是自己的局部最优解,填入他自己

 

 下一个元素判断,他的前面的最优解是否为负数的话就上,自己本身,前面不是负数的话就把最优解自己填入

这里的第二个是-1 ,前面是-2 ,是负数,填入自己就行

 

 经过运算最后我们可以得到

 

 解下来在里面找到最大值即可,最大值就是他们的子段最大和

状态转移方程代码

 通过以上的分解后,我们可以得到这样一个状态转移方程

function maxSubArray ( nums: number[] ) : number {
    for (let i = 1; i < nums. length; i++) {
        if(nums[i一1]>0){
            nums[i] = nums[i] + nums[i-1] ;
        }
    }
        return Math.max( ...nums ) ;
};
                

返回序列信息

由于我们知道了最大sum值就是他的最长值

所以最大sum值就是得到子段的最后一个元素

我们从最后一个开始,往前遍历到负数的局部最优解,就是序列开始的前一个了

这样就能知道序列的开头和结尾了

代码

# include<stdio.h>
 
int main(){
    int n;
    scanf("%d", &n);
    int a[n]={0};
    for(int i = 0;i<n;i++){
        scanf("%d", &a[i]);
    }
    int max = 0;  // 最大值
    int tem = 0;  // 段值
    for(int i=0;i<n;i++){
        if(tem>0)  // 前面一段值大于0
            tem+=a[i];
        else{  // 前面一段值小于0
            tem=a[i];  // 抛弃前面的段值,更新段值
        }
        if(tem>max){  // 更新最大值
            max=tem;
        }
    }
    printf("%d", max);
    return 0
}

 

标签:最大,nums,子段,负数,数组,序列,子序
From: https://www.cnblogs.com/kuailest/p/16882255.html

相关文章

  • 2022NOIP A层联测25 惊喜二十二 K-构造 函数的权力 最大可达流形
    T1[计数类DP/转化]给出2个排列p,q,长度都是n,其中p完全给出,\(\existspi=0\Leftrightarrowi位置可以填任意[1,n]之间的数使得q构成排列\),问长度是n的01串S的个数,使得存在2*......
  • python调用golang 从指定序列中找出一组与目标值最接近的子序列 kayb
    python调用golang从指定序列中找出一组与目标值最接近的子序列编写go代码生成so库python代码调用编写go代码写入hello.go文件packagemainimport( "C" "en......
  • Dinic(最大流/最小割+费用流)
    最大流/最小割:1typedeflonglongll;2constintN=1e4+5;3constintM=2e5+5;4constllinf=1e18;5intn,m,s,t,tot;6llhead[N],to[......
  • ZS_2461_长度为K子数组中的最大和
    思路滑动窗口+Map维护元素出现次数,然后遍历一遍即可求出答案滑动窗口滑动窗口是双指针的一种特例,任意时刻只有一个指针在运动,另一个指针静止,指针包含区域称为窗口......
  • 25、递归搜索目录找出最大的文件
    题目:  在变量名serach_dir中,随意添加一个文件路径,找出所有文件下最大的文件。思路:  1、输入文件路径。  2、递归遍历该文件路径下所有子目录。  3、遍历子目......
  • P2272 [ZJOI2007]最大半连通子图
    原题链接题目的意思就是说找到最长路径的长度及数量。显然,我们首先要tarjan缩点,然后建立新图,但要注意的是不能有重边,因为会影响我们计算数量,那我们可以用map记录一下两点......
  • LIS 最长递增子序列 三种求解方式
    1dp2二分3indextree 题目描述给出一个列表如[[6,7,],[5,4],[3,2]],表示木块的长和宽,当木块的长和宽不大于另个木块的长和宽时,就可以放在上面,此外数组还可以左右翻......
  • K 次增加后的最大乘积
    题目给你一个非负整数数组 nums 和一个整数 k 。每次操作,你可以选择 nums 中任一 元素并将它增加 1 。请你返回至多 k 次操作后,能得到的 nums的 最大乘......
  • 764. 最大加号标志
    764.最大加号标志题解:枚举二维数组每个位置,向上、下、左、右四个方向能延伸的最长长度取这四个方向的最小值,即为答案可以用f[i]=f[i-1]+1计算四个方向的最大......
  • 最大加号标志
    题目在一个nxn的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1。mines[i]=[xi,yi]表示 grid[xi][yi]==0返回 grid中包含 1 的......