Use três perguntas da entrevista para entender a lógica básica da programação dinâmica (o primeiro aperitivo)

Link do título original: a soma máxima de submatrizes consecutivas

Clique aqui para conquistar a segunda via! ! !
Descrição do título:

Insira uma matriz de inteiros. Um ou mais inteiros consecutivos na matriz formam uma submatriz. Encontre o valor máximo da soma de todas as submatrizes.

A complexidade de tempo necessária é O (n).

 

Exemplo 1:

Entrada: nums = [-2,1, -3,4, -1,2,1, -5,4]
Saída: 6
Explicação: A soma de submatrizes consecutivas [4, -1,2,1] é o maior, que é 6.

 

incitar:

    1 <= arr.length <= 10 ^ 5
    -100 <= arr [i] <= 100

Fonte: LeetCode
Link: https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof
Copyright é propriedade da LeetCode . Para reimpressões comerciais, favor contatar a autorização oficial Para reimpressões não comerciais, favor indicar a fonte.

Idéias de perguntas:

1. Uma breve introdução à programação dinâmica

A Programação Dinâmica (Dynamic Programming), conhecida como dp, é uma estratégia comum para resolver problemas de otimização.Geralmente, usar a programação dinâmica para resolver problemas nada mais é do que três etapas.

1.1 Definir o estado (o estado é o problema original, a solução do subproblema), como definir o significado de dp (i)

1.2 Defina o estado inicial (limite), como definir o valor de dp (0)

1.3 Determine a equação de transição de estado, como determinar a relação entre dp (i) e dp (i-1)

2. Então, usando essas três etapas, vamos ver como resolver o problema acima.

2.1 Assumindo que o valor de nums é {-2,1, -3,4, -1,2,1, -5,4}, é óbvio que a soma de subsequência contínua máxima é 4 + (- 1) +2 +1 = 6

2.2 Definir status

Assumindo que dp (i) é a soma da maior subsequência consecutiva terminando em nums [i], o que isso significa? Por exemplo

nums [0], a maior subsequência contínua no final de -2 é -2, então dp (0) = -2

nums [1], a maior subsequência contínua no final de 1 é 1, então dp (1) = 1

nums [2], a maior subsequência contínua no final de -3 é 1, -3, então dp (2) = dp (1) + (- 3) = -2

nums [3], a maior subsequência contínua no final de 4 é 4, então dp (3) = 4

nums [4], a maior subsequência contínua no final de -1 é 4, -1, então dp (4) = dp (3) + (- 1) = 3

nums [5], a maior subsequência contínua no final de 2 é 4, -1, 2, então dp (5) = dp (4) + 2 = 5

nums [6], a maior subsequência contínua no final de 1 é 4, -1, 2, 1, então dp (6) = dp (5) + 1 = 6

nums [7], a maior subsequência contínua no final de -5 é 4, -1, 2, 1, -5, então dp (7) = dp (6) + (-5) = 1

nums [8], a maior subsequência contínua no final de 4 é 4, -1, 2, 1, então dp (6) = dp (7) + 4 = 5

Assim, podemos encontrar a lei. Na verdade, contanto que a soma das maiores subsequências contínuas na frente seja maior que 0, precisamos dela. Se for menor ou igual a 0, não precisamos dela.

2.3 Equação de transição de estado

Se dp (i-1) <= 0, então dp (i) = nums [i]; se dp (i-1)> 0, então dp (i) = dp (i-1) + nums [i];

2.4 Estado inicial

O valor de dp (0) é nums [0]

2.5 Assim, a solução final deve ser a subsequência contínua máxima e o valor máximo em dp (i), ou seja, max {dp (i)}, i∈ [0, nums.length) ·

3. Se for muito obscuro, irei explicá-lo em um inglês simples

Por exemplo, você está jogando King of Glory. Os elementos na matriz nums [] são o poder de combate de cada jogador. Em dp (i) está o poder de combate mais forte da equipe que termina com i. Porque King of Glory é uma batalha em equipe, você tem que escolher uma equipe. Você definitivamente escolherá uma equipe com maior eficácia em combate para se juntar? Deite-se para vencer, quem não quer, assim que encontrar uma equipe cuja eficácia em combate não seja maior que a sua , ou seja, é menor ou igual a 0, não faça. O grande, você entra no time, mas ah, porque se você adicionar um time, outros também vão adicionar. Tem gente cujo combate poder é menor que 0 e aqueles que são melhores do que você querem abraçar suas coxas. Esse tipo de pessoa é para sua equipe. Em outras palavras, é complicado e você não pode julgar a próxima pessoa a participar, o que é a eficácia do combate, então depois que todos os jogadores se juntaram às suas respectivas equipes, você descobrirá que deve haver a equipe de combate mais forte.Neste momento, você pode Escolher juntar-se a eles e juntar forças, não é apenas matar indiscriminadamente? ! !

Não fale bobagem, basta ir ao código, para que os juízes entendam mais claramente, meu código não é escrito de forma concisa, adiciono muitos comentários ao código, acredito que os juízes podem entender, se eu fiz não escrever de forma clara ou Se você cometer um erro, pode comentar na área ou enviar uma mensagem privada para mim

class Solution {
    //记住一句话,递推就是由底向上的计算过程
    //假设dp(i)是以nums[i]结尾的最大连续子序列和(nums是整个序列)
    //例如dp[4]是以nums[4]结尾的最大连续子序列和
    public int maxSubArray(int[] nums) {
        //如果数组只有一个元素,那么最大和肯定只有这个元素了,就直接返回
        if(nums.length < 2) return nums[0];
        //取出第一个元素
        int dp = nums[0];
        //假设第一个元素是最大和
        int max = dp;
        for(int i = 1; i < nums.length; i++){    //遍历后面的元素 
            if(dp <= 0){    //如果遍历到某个元素,发现前面的最大连续子序列和是小于等0
            //那么这个元素就是当前的最大连续子序列和,因为很简单,前面都是负数了,我还要来干嘛,如果这个元素加上他们,岂不是更小了?所以不如不要
                dp = nums[i];
            }else{
                //发现前面的最大连续子序列和是大于0,那么我们就尝试把这个元素加进去
 /*
那可能会有这么个疑惑,假如当前元素是小于0呢?加进去岂不是会让之前的最大连续子序列和更小?其实不会,因为下面关于max代码就是会在max和dp取较大值,
由于在执行dp = dp + nums[i]之前,max肯定是之前的最大连续子序列和,所以即使当前元素是小于0也不怕,因为执行下面代码的时候,max应该是等于max而不是dp
*/
                dp = dp + nums[i];
            }
            //这里取较大和
            max = Math.max(max,dp);
        }
        //返回最大和
        return max;
    }
}

Já vi de tudo aqui, não pensa em clicar em curtir antes de sair? Se você não gostar, meu coração estará bêbado.

 

Acho que você gosta

Origin blog.csdn.net/qq_45798556/article/details/114844023
Recomendado
Clasificación