Oferta de dedo espada Pregunta 30
El tema es el siguiente
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;
}
};