分治 最大连续和

分治三步:1.划分问题 2.递归求解 3.合并问题 (nlogn)

int maxsum(int *A ,int x ,int y) { //返回数组在[x,y)区间内的最大连续和
    if(y-x==1) return A[x];
    int mid=x+(y-x)/2;   //划分[x,m)和[m,y)
    int maxs=max(maxsum(A,x,mid),maxsun(A,mid,y));  //递归求解
    int v=0,L=A[m-1];
    for(int i=m-1;i>=x;i--) { //合并(1)
        v+=a[i];
        L=max(L,v);
    }
    v=0;int R=A[m];
    for(int i=m;i<y;i++) {  //合并(2)
        v+=a[i];
        R=max(R,v);
    }
    maxs=max(maxs,L+R);
    return maxs;
} 

注意细节 1.左闭右开区间在数组分割时比较简单 2. mid=(x+y)/2; mid=x+(y-x)/2; 计算机中有差别,后者确保分界点靠近区间起点

时间: 2024-10-16 06:03:51

分治 最大连续和的相关文章

ACM:递归与分治,最大连续和,O(n3), O(n2), O(nlogn), O(n) 算法。

题目,求一个连续的数组,最大连续和. (一)O(n3)算法: 利用穷举法的思想,这种方法的效率最差. 代码如下: #include <iostream> #include <cstdlib> #include <ctime> #include <cmath> using namespace std; const int MAXN = 1000; int A[MAXN], n; int maxsum(int *A, int n) { int beat = A[

最大连续子序列和 分治思想和动态规划思想

解决最大连续子序列和的两种方法:分治,动态规划. 分治时间复杂度虽然更高,但我还是写了一遍加深对这种思想的理解:将一个问题分治成若干个小的同样思路的子问题来解决.本题将所求序列等分成左右两个子序列,愿序列的最大子序列和必是左序列最大子序列和,有序列最大子序列和,跨左右子序列最大和三者中的最大者. 动态规划:用dp[i]更新dp[i+1]就行. 分治: // // main.cpp // 1109 // // Created by Fangpin on 15/3/9. // Copyright (

2.分治算法研究-搜索数组中的最大连续子集和 2014-3-11 11:37 阅读(16)

//分治算法研究var cc=consolefunction find_max_crossing_subarray(A,low,mid,high){    var max_left=mid,max_right=mid    var left_sum=0    var sum=0    for(var i=mid;i>=low;i--){        sum=sum+A[i]        if(sum>left_sum){            left_sum=sum           

UVALive - 3938 分治,线段树,求动态最大连续和

UVALive - 3938 题意: 给出一个长度为n的整数序列D,你的任务是对m个询问作出回答.对于询问(a,b),需要找到两个下标x和y,使得a≤x≤y≤b,并且Dx+Dx+1+...+Dy尽量大.如果有多组满足条件的x和y,x应该尽量小.如果还有多解,y应该尽量小. tags: 分治思想,线段树       大白书201 区别于静态最大连续和,只能用分治算法: 最优解要么完全在左半序列,要么完全在右半序列,要么跨越中点. 我们构造一棵线段树,维护 3 个值:最大连续和 max_sub ,最

最大连续和(线段树+分治)

最大连续和 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 61(13 users) Total Accepted: 15(9 users) Rating: Special Judge: No Description 给出一个长度为n的整数序列D,你的任务是对m个询问做出回答.对于询问(a,b),需要找到 两个下标x和y,使得a<=x<=y<=b,并且Dx+Dx+1+....+Dy尽量大.如果有多组满足条件的x和y,x 应尽

分治策略求解数组的最大连续子数组的和

对于一个数组,尽可能地划分成两半(二分),加和最大的连续字数组或者在左边,或者在右边,或者跨越中间,一部分在左边,一部分在右边. 那么只要求出左半段数组的加和最大的连续子数组的和,求出右半段数组的加和最大的连续子数组的和,求出跨越中间的最大连续字数组的和,只要通过三者判断求出最大的那么就是整个数组最大的连续子数组的和. 那么找出左半段和右半段的最大连续子数组的和其实就是比原问题规模更小的一个问题,因此对于左半段和右半段求解加和最大的连续子数组的和可以通过递归求得. 下面给出具体实现:. 首先是调

最大连续子序列和

对于给定的数组 numnum,一个长度为 ss 的连续子序列是指由 num_i,num_{i+1},num_{i+2}\ldots,num_{i+s-1}num?i??,num?i+1??,num?i+2??…,num?i+s−1?? 组成的序列.数组中的元素有可能为正数.负数或 00.你需要从数组中找出元素总和最大的一个连续子序列. 比如,对于数组 1,-3,2,6,-5,81,−3,2,6,−5,8,其最大连续子序列之和是 2+6-5+8=112+6−5+8=11. 对于一段区间内的最大连续

分治策略 - 最大子序列问题

自开始学习算法起,我感觉就是跪着把<算法导论>的代码看一遍.理解一遍然后敲一遍...说实话自己来写并且要求时间复杂度达到要求,我肯定是不能做到的,但我想前辈们辛苦积累的研究成果贡献出来也是为了让后人少走一些弯路,所以我的作用就是把前辈们的成果学习之后加以理解,然后积累经验,领悟到他们解决问题时的思路和灵感.还有就是把个人理解后的知识存储在不会忘记的地方作为复习备用... 当然什么是写博客呢,我个人认为是把所学的知识加上自己的理解然后用较为通俗的语言来解释一遍,至少这样才有可能把学到的东西变为自

BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字, 即每个子序列里至少存在一个数字只出现一次. 给定一个整数序列,请你判断它是不是不无聊的. [题解] 预处理每个元素上一次出现位置和下一个出现位置, 我们发现对于一个子序列[L,R]来说, 如果存在pre[i]<L&&nxt[i]>R那么这个子序列一定是满足条件的, 否则就不