[Aprenda programación dinámica] Subsecuencia creciente más larga (26)

Tabla de contenido

¿Cómo aprender programación dinámica?

1. Análisis de preguntas

2. Principio del algoritmo

1. Visualización de estado

2. Ecuación de transición de estado

3. Inicialización

4. Orden de cumplimentación del formulario

5. Valor de retorno

3. Escritura de código

Escribe al final:


¿Cómo aprender programación dinámica?

No existe ningún atajo para aprender un algoritmo, y mucho menos aprender programación dinámica.

¡Ven conmigo para resolver preguntas sobre algoritmos de programación dinámica y aprender programación dinámica juntos!

1. Análisis de preguntas

Enlace de pregunta: 300. La subsecuencia creciente más larga: LeetCode 

Como sugiere su nombre, esta pregunta consiste en encontrar la subsecuencia creciente más larga y luego devolver la longitud.

Pero lo que debemos dejar claro es que se debe distinguir claramente qué es una subsecuencia y qué es un subarreglo.

Los subarreglos deben ser contiguos,

No es necesario que la subsecuencia sea continua, podemos sentirlo en el ejemplo 1,

Mientras los elementos en este rango de matriz aumenten, puede omitir la selección.

En resumen, la subsecuencia se puede seleccionar saltando dentro de un intervalo, es decir, se puede hacer discontinua.

2. Principio del algoritmo

1. Visualización de estado

dp[i] representa la longitud de la subsecuencia creciente más larga entre todas las subsecuencias que terminan en la posición i.

2. Ecuación de transición de estado

Podemos dividirlo en dos situaciones,

El primer caso es que la posición i en sí misma es una subsecuencia y la longitud es 1

El segundo caso es que la posición i y cualquier posición anterior forman una subsecuencia, establecemos la posición que es mayor o igual a 0 y menor que i como j

Debido a que la pregunta requiere incremento, necesita nums[ j ] < nums[ i ], que es igual a dp[ j ] + 1,

Hay muchas situaciones para j, por lo que necesitamos encontrar el valor máximo de dp[j] en la posición 0 <= j <= i - 1.

3. Inicialización

Podemos inicializar la tabla a 1 para que solo podamos considerar el segundo caso.

4. Orden de cumplimentación del formulario

De izquierda a derecha.

5. Valor de retorno

Simplemente devuelva el valor máximo en la tabla dp.

3. Escritura de código

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n, 1);
        for(int i = 1; i < n; i++) 
            for(int j = 0; j < i; j++) 
                if(nums[j] < nums[i]) 
                    dp[i] = max(dp[j] + 1, dp[i]);
        int ans = INT_MIN;
        for(auto e : dp) ans = max(ans, e);
        return ans;
    }
};

Escribe al final:

Ese es el contenido de este artículo, gracias por leer.

Si crees que has ganado algo, puedes darle un me gusta al blogger .

Si hay omisiones o errores en el contenido del artículo, envíe un mensaje privado al blogger o indíquelo en el área de comentarios ~

Supongo que te gusta

Origin blog.csdn.net/Locky136/article/details/131990734
Recomendado
Clasificación