(分治算法) 最大连续部分和
2018-03-25 17:07
501 查看
最大连续部分和数组中整数有正有负求连续一子段,使得和最大化2,4,-7,5,2,-1,2,-4,3最大连续段:5,2,-1,2最大和为8
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));
}
}
分治求解法
考虑将数组从中间分为两个子数组,则最大子数组必然出现在以下三种情况之一: 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));
}
}
相关文章推荐
- 求一个数组的两段连续的部分的最大和
- 蓝桥杯C语言培训6 分治法与动态规划 最大连续部分和
- 编程珠玑第八章——分治算法求解数组中的最大的连续和
- 在含有0的一百个整数中,找出连续三个数之和最大的部分
- [PAT甲级]1007. Maximum Subsequence Sum(求连续最大子序列和)
- 求数组中连续子元素的最大值(动态规划)
- 查找字符串中最大连续字符
- hdu 1024 Max Sum Plus Plus 一串数字中,m段连续数字最大和 滚动数组+dp
- 分治连续和最大字串
- 【HDU5583 2015上海赛区K】【暴力合并】Kingdom of Black and White 连续01串权值贡献为len^2最多改变一次最大权值
- 软件工程结对开发之求一个或者多个数组中连续最大子数组之和3
- 线段树+DP 求区间连续最大子段和 hoj Candy
- 2017滴滴秋招笔试编程题-求连续子数组的最大和
- 求解一个数组中连续元素最大值
- 数组非连续元素最大和
- 程序员编程艺术:第七章、求连续子数组的最大和
- 最大连续子段和dp
- 连续子数组的最大和
- HLG 2116 Maximum continuous product (最大连续积 DP)
- 最大连续字串和