Max Field Sum (Dividir e Conquistar, Recursão, Java)

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;
    }
}

Acho que você gosta

Origin blog.csdn.net/Javascript_tsj/article/details/123882411
Recomendado
Clasificación