首页 > 编程语言 >算法第二章3·7-4 最大子段和

算法第二章3·7-4 最大子段和

时间:2022-09-25 13:55:45浏览次数:44  
标签:right return 子段 int mid 算法 第二章 left

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

要求算法的时间复杂度为O(n)。

输入格式:

输入有两行:

第一行是n值(1<=n<=10000);

第二行是n个整数。

输出格式:

输出最大子段和。

输入样例:

在这里给出一组输入。例如:

6
-2 11 -4 13 -5 -2
 

输出样例:

在这里给出相应的输出。例如:

20
  代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB           #include<iostream>
#include<vector>
#include<cmath>
using namespace std;
 
const int N=1e6+10;
int n;
int a[N];
 

int f(int left,int right){//a[left].......a[right]横跨左右的最大字段和

int mid=(left+right)/2;

int sumleft=0,ansleft=a[mid];

int sumright=0,ansright=a[mid+1];

 

for(int i=mid;i>=left;i--){//往左依次加

sumleft+=a[i];

if(sumleft>ansleft)
ansleft=sumleft;
}

 

for(int i=mid+1;i<=right;i++){//往右依次加

sumright+=a[i];

if(sumright>ansright)
ansright=sumright;
}

 

return ansleft+ansright;

}

 

int MaxSum(int left,int right){

if(left==right)
  {
        return a[left] >= 0 ? a[left] : 0;
    }//对于条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。
    else {//当所给的整数均为负数时,定义子段和为0。

int mid=(left+right)/2;
int L=MaxSum(left,mid);
int R=MaxSum(mid+1,right);
int LR=f(left,right);

return max(max(L,R),LR);
}
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    cout<<MaxSum(0,n-1)<<endl;
    return 0;
}

标签:right,return,子段,int,mid,算法,第二章,left
From: https://www.cnblogs.com/pfwvan666/p/16727734.html

相关文章

  • 10种常见的回归算法总结和介绍
    线性回归是机器学习中最简单的算法,它可以通过不同的方式进行训练。在本文中,我们将介绍以下回归算法:线性回归、Robust回归、Ridge回归、LASSO回归、ElasticNet、多项式......
  • 力扣算法之数组中出现次数超过一半的数字
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例:输入:[1,2,3,2,2,2,5,4,2]输......
  • 斐波那契查找算法
    斐波那契也称黄金分割法,通过黄金分割点找到mid值,即mid=low+F(k-1)-1 (F代表斐波那契数列)对F(k-1)-1的理解由斐波那契数列F[k]=F[k-1]+F[k-2]的性质,可以得到 (F[k]-1......
  • vue3和react虚拟DOM的diff算法区别
    vue3随着Vue3.0版本的发布,我们在使用或者对其源码进行阅读时会惊讶的发现,它又又又双叒叕变强了,尤大本人在直播中也提到新的Vue会比老的Vue有1.3到2倍的提升,它的更新机制会......
  • 插值查找算法
    简介插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。将折半查找中的求mid索引的公式,low表示左边索引left,high表示右边索引right. key......
  • 二分查找算法
    简介只能对有序数组进行查找代码实现publicclassBinarySearch{ publicstaticvoidmain(String[]args){ //查找单个数据 intarr[]={1,8,10,8......
  • 博奕类算法
    京东笔试,总体难度比较低,但是最后一道我做不来这题如果有思路应该不难,我觉得应该是动态规划相关的题目题目长这样我又看到力扣有这种博弈类型的题目,我觉得这是我的盲区......
  • 通关基本算法 day_06 -- 差分
    差分原理差分是前缀和的逆运算给定一个长度为n的a数组,构造一个b数组,使得:$$a_i=b_1+b_2+b_3+...+b_i\b_1=a_1\b_2=a_2-a_1\b_n=a_n-a_{n-1}$$b就称为a的......
  • 猎人猎物优化算法
    猎人猎物优化算法连续空调间的优化算法importnumpyasnpfromtqdmimporttqdm#进度条设置importrandomfrommatplotlibimportrcParamsimportmathimportmatpl......
  • 速度之巅-位图算法
     代码实现:    ......