Tabla de contenido
¿Cómo aprender programación dinámica?
2. Ecuación de transición de estado
4. Orden de cumplimentación del formulario
¿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 ~