您的位置:首页 > 其它

(分治算法) 最大连续部分和

2018-03-25 17:07 501 查看
最大连续部分和数组中整数有正有负求连续一子段,使得和最大化2,4,-7,5,2,-1,2,-4,3最大连续段:5,2,-1,2最大和为8

分治求解法

    考虑将数组从中间分为两个子数组,则最大子数组必然出现在以下三种情况之一:    1、完全位于左边的数组中。    2、完全位于右边的数组中。    3、跨越中点,包含左右数组中靠近中点的部分。    递归将左右子数组再分别分成两个数组,直到子数组中只含有一个元素,退出每层递归前,返回上面三种情况中的最大值。实现代码如下:import java.util.*;
import java.math.*;

public class Main {

public static int F(int[] a, int start, int end) {

if(end - start == 1) {

if(a[start] > 0) {
return a[start];
}
return 0;
} //递归出口

int k = (start + end) >> 1;

//找左半边和右半边的连续和最大值
int left = F(a, start, k);
int right = F(a, k, end);

//向左扩展
int sum = 0;
int sumleft = 0;

for(int i = k-1; i>= start; i--) {
sum += a[i];
if(sum >= sumleft) {
sumleft = sum;
}
}

//向右扩展
sum = 0;
int sumright = 0;
for(int i = k; i < end; i++) {
sum += a[i];
if(sum >= sumright) {
sumright = sum;
}
}

int sumzong = sumright + sumleft;
return Math.max(sumzong, Math.max(left, right));
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);

int n = cin.nextInt();
int[] a = new int
;

for(int i = 0; i < n; i++) {
a[i] = cin.nextInt();

}

System.out.println(F(a, 0, n));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: