[剑指 oferta] JT30 --- Suma máxima de submatrices consecutivas (programación dinámica [la ilustración más detallada de toda la red])

El tema es el siguiente

Inserte la descripción de la imagen aquí

Análisis de programación dinámica

¿Qué es la programación dinámica?
Es la teoría de la optimización, queremos obtener lo mejor, entonces la respuesta no solo es la mejor actual, sino que también depende de si el estado anterior es el mejor.
¿Cómo utilizar la programación dinámica?
Lo más importante para utilizar la programación dinámica es encontrarEcuación de transición de estado
Tome esta pregunta como
ejemplo. Usemos la matriz dp para registrar los 8 números en la muestra.
El significado es: La suma de la submatriz más grande que contiene el i-ésimo número (i es al menos 0) es el número en sí

dp [0] dp [1] dp [2] dp [3] dp [4] dp [5] dp [6] dp [7]
1 -2 3 10 -4 7 2 -5

Lo más importante es encontrar la ecuación de transición de estado. En
realidad, es muy fácil de encontrar. Es agregar el subarreglo más grande al frente y compararlo con usted mismo. Si el anterior se agranda, simplemente actualice el arreglo dp .
Estudiantes, ¡ejecutemos juntos esta matriz dp!
dp [0] = 1;
dp [1] = dp [1] + dp [0]> dp [1]? dp [1] + dp [0]: dp [1] = dp [0] + dp [1 ] = 1-2 = -1;
dp [2] = dp [2] + dp [1]> dp [2]? Dp [2] + dp [1]: dp [2] = dp [2] = 3 ; No
escribiré juicios a continuación, es directamente igual a él, y todos deberían entenderlo.Escribiendo TT cansado
dp [3] = 3 + 10 = 13;
dp [4] = 13-4 = 9;
dp [5] = 9 + 7 = 16;
dp [6] = 16 + 2 = 18;
dp [7] = 18-5 = 13;
La matriz dp después de la programación dinámica es la siguiente:

dp [0] dp [1] dp [2] dp [3] dp [4] dp [5] dp [6] dp [7]
1 -1 3 13 9 dieciséis 18 13

De un vistazo, la suma máxima es el valor máximo en el interior, que es 18

¿De repente sintió que la programación dinámica es muy simple y lo entiende todo a la vez?

el código se muestra a continuación

class Solution {
    
    
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
    
    
        int currCrest=array[0],crest=array[0];
        for(int i=1;i<array.size();i++){
    
    
            currCrest=max(currCrest+array[i],array[i]);
            crest=max(currCrest,crest);
        }
        return crest;
    }
};

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_42136832/article/details/114867405
Recomendado
Clasificación