Utilice tres preguntas de la entrevista para comprender la lógica básica de la programación dinámica (el primer aperitivo)

Enlace del título original: la suma máxima de submatrices consecutivas

¡Haz clic aquí para conquistar el segundo camino! ! !
Descripción del Título:

Introduzca una matriz de enteros. Uno o más enteros consecutivos en la matriz forman una submatriz. Encuentre el valor máximo de la suma de todas las submatrices.

La complejidad de tiempo requerida es O (n).

 

Ejemplo 1:

Entrada: nums = [-2,1, -3,4, -1,2,1, -5,4]
Salida: 6
Explicación: La suma de submatrices consecutivas [4, -1,2,1] es el más grande, que es 6.

 

inmediato:

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

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Ideas de preguntas:

1. Una breve introducción a la programación dinámica

La Programación Dinámica (Programación Dinámica), conocida como dp, es una estrategia común para resolver problemas de optimización En términos generales, el uso de la programación dinámica para resolver problemas no es más que tres pasos.

1.1 Definir el estado (el estado es el problema original, la solución del subproblema), como definir el significado de dp (i)

1.2 Establecer el estado inicial (límite), como establecer el valor de dp (0)

1.3 Determinar la ecuación de transición de estado, como determinar la relación entre dp (i) y dp (i-1)

2. Entonces, usando estos tres pasos, veamos cómo resolver el problema anterior.

2.1 Suponiendo que el valor de nums es {-2,1, -3,4, -1,2,1, -5,4}, es obvio que la suma máxima de subsecuencias continuas es 4 + (- 1) +2 +1 = 6

2.2 Definir estado

Suponiendo que dp (i) es la suma de la subsecuencia consecutiva más grande que termina en nums [i], ¿qué significa? P.ej

nums [0], la subsecuencia continua más grande al final de -2 es -2, entonces dp (0) = -2

nums [1], la subsecuencia continua más grande al final de 1 es 1, por lo que dp (1) = 1

nums [2], la subsecuencia continua más grande al final de -3 es 1, -3, entonces dp (2) = dp (1) + (- 3) = -2

nums [3], la subsecuencia continua más grande al final de 4 es 4, entonces dp (3) = 4

nums [4], la subsecuencia continua más grande al final de -1 es 4, -1, entonces dp (4) = dp (3) + (- 1) = 3

nums [5], la subsecuencia continua más grande al final de 2 es 4, -1, 2, entonces dp (5) = dp (4) + 2 = 5

nums [6], la subsecuencia continua más grande al final de 1 es 4, -1, 2, 1, entonces dp (6) = dp (5) + 1 = 6

nums [7], la subsecuencia continua más grande al final de -5 es 4, -1, 2, 1, -5, entonces dp (7) = dp (6) + (-5) = 1

nums [8], la subsecuencia continua más grande al final de 4 es 4, -1, 2, 1, entonces dp (6) = dp (7) + 4 = 5

Entonces podemos encontrar la ley. De hecho, siempre que la suma de las subsecuencias continuas más grandes al frente sea mayor que 0, la necesitamos. Si es menor o igual que 0, no la necesitamos.

2.3 Ecuación de transición de estado

Si dp (i-1) <= 0, entonces dp (i) = nums [i]; si dp (i-1)> 0, entonces dp (i) = dp (i-1) + nums [i];

2.4 Estado inicial

El valor de dp (0) es nums [0]

2.5 Entonces, la solución final debe ser la subsecuencia continua máxima y el valor máximo en dp (i), es decir, max {dp (i)}, i∈ [0, nums.length) ·

3. Si es demasiado oscuro, lo explicaré en un inglés sencillo.

Por ejemplo, estás jugando King of Glory. Los elementos en la matriz nums [] son ​​el poder de combate de cada jugador. En dp (i) es el poder de combate más fuerte del equipo que termina con i. Porque King of Glory es una batalla en equipo, tienes que elegir un equipo, ¿definitivamente elegirás un equipo con mayor efectividad de combate para unirte? Acuéstate para ganar, quién no quiere, así que una vez que te encuentres con un equipo cuya efectividad de combate no sea mayor que la tuya , es decir, es menor o igual a 0, no lo hagas. El grande, te unes al equipo, pero oh, porque si agregas un equipo, otros también lo agregarán. Hay algunas personas cuyo combate el poder es menor que 0 y aquellos que son mejores que tú quieren abrazar tus muslos. Ese tipo de persona es para tu equipo. En otras palabras, es engorroso, y no puedes juzgar a la siguiente persona que se unirá, lo que es la efectividad del combate, así que después de que todos los jugadores se hayan unido a sus respectivos equipos, encontrarás que debe haber el equipo de combate más fuerte. En este momento, puedes elegir unirte a ellos y unir fuerzas, ¿no es solo matar indiscriminadamente? ! !

No digas tonterías, solo ve al código, para que los jueces entiendan más claramente, mi código no está escrito de manera concisa, agrego muchos comentarios al código, creo que los jueces pueden entender, si lo hice no escribes claro o si te equivocas, puedes comentar en el área o enviarme un mensaje privado

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

Lo he visto todo aquí, ¿no piensas en hacer clic en un me gusta antes de irte? Si no te gusta, mi corazón será Bingbing.

 

Supongo que te gusta

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