analisar
Aqui pegamos o array arr[]={-20,11,-4,13,-5,-2}; como exemplo
Encontrar subintervalos e a soma máxima é estruturalmente muito adequado para o método de dividir e conquistar, porque todos os subintervalos [início, fim] só podem ter as três possibilidades a seguir:
Na área de [0, (arr.length-1)/2] Na área de
[(arr.length-1)/2+1, arr.length-1] o
ponto de partida está em [ 0, (arr.length- 1)/2], o ponto final está dentro de [(arr.length-1)/2+1, arr.length-1]
O maior dos três casos acima é o desejado. Os dois primeiros casos obedecem às propriedades recursivas dos subproblemas, de modo que a recursão pode ser obtida. Para o terceiro caso, ela precisa ser tratada separadamente. O terceiro caso deve incluir ( arr. length-1)/2 e (arr.length-1)/2+1 duas posições, então você pode usar a segunda ideia exaustiva para encontrar:
1. Pegue (arr.length-1)/2 como o ponto final, mova para a esquerda para expandir e encontre o leftSum com a maior soma
2. Pegue (arr.length-1)/2+1 como o ponto inicial , mova para a direita para expandir, encontre Out e o maior rightSum
3. leftSum+rightSum=midSum midSum é o valor máximo possível do terceiro caso
//最大子段
public class Maxsize {
public static void main(String[] args) {
int arr[]={-20,11,-4,13,-5,-2};
System.out.println(maxsize(arr,0,arr.length-1));
}
public static int maxsize(int[] arr, int left, int right){
int sum=0,midSum=0,leftSum=0,rightSum=0;
int center,s1,s2,lefts,rights;
//如果序列长度为1时
if (left==right){
sum=arr[left];
}
else {
//划分
center=(left+right)/2;
//左递归
leftSum=maxsize(arr,left,center);
//又递归
rightSum=maxsize(arr,center+1,right);
s1=0;lefts=0;
for (int i=center;i>=left;i--){
lefts+=arr[i];
if (lefts>s1){
s1=lefts;
}
}
s2=0;rights=0;
for (int j=center+1;j<=right;j++){
rights+=arr[j];
if (rights>s2){
s2=rights;
}
}
midSum=s1+s2;
if (midSum<leftSum){
sum=leftSum;
}
else {
sum=midSum;
}
if (sum<rightSum){
sum=rightSum;
}
}
return sum;
}
}