Tabla de contenido
¿Cómo aprender programación dinámica?
2. Ecuación de transición de estado
¿Cómo aprender programación dinámica?
No hay atajos para aprender un algoritmo, y mucho menos aprender programación dinámica,
¡Repasen conmigo las preguntas sobre algoritmos de programación dinámica y aprendan programación dinámica juntos!
1. Análisis del tema
Esta pregunta no es difícil de entender, es decir, según el número de la cadena dada en la pregunta,
Luego, cuántos casos se decodifican en letras, y luego tenga en cuenta que los números con ceros a la izquierda no se pueden decodificar.
2. Principio del algoritmo
1. Representación de estado
El estado de esta pregunta indica que, de hecho,
¿Qué representa la posición dp[ i ] y la posición dp[ i ] representa el número total de métodos de decodificación en la i-ésima posición?
2. Ecuación de transición de estado
El método de solución de la expresión de estado es dividir el problema según el último paso,
Analicémoslo, dp[ i ] tiene dos métodos de decodificación,
1. s[ i ] se decodifica por separado. Si se decodifica por separado, cuando el valor de s[ i ] es 1~9, se puede decodificar por sí mismo.
El número de esquemas decodificados por uno mismo es dp[i - 1], si el valor de s[i] es 0, el número de esquemas es 0 y la decodificación general falla.
2. s[ i ] y s[ i - 1 ] se decodifican juntos, cuando el valor de s[ i - 1 ] * 10 + s[ i ] es 10~26, se puede decodificar,
Y el número de decodificación es dp[ i - 2 ], si la decodificación falla y no está en este rango, entonces el número de soluciones también es 0.
Entonces podemos concluir que la ecuación de transición es aproximadamente:
dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] (reglas de juicio basadas en el número de esquemas arriba)
3. Inicialización
La inicialización es para evitar el cruce de fronteras al completar el formulario.
Y nuestra ecuación de transición de estado necesita usar dp[ i - 1 ] y dp[ i - 2 ],
Así que vamos a inicializar las posiciones dp[ 0 ] y dp[ 1 ],
Posición dp[ 0 ], si s[ 0 ] se decodifica con éxito, es 1, y si no tiene éxito, es 0
Posición dp[ 1 ], si dp[ 1 ] se puede decodificar solo, entonces + 1, si se puede decodificar junto con dp[ 0 ], entonces + 1,
0 si dp[ 1 ] no se puede decodificar en ninguno de los dos casos. (así que tal vez 0, 1, 2)
4. Orden de llenado
El orden de llenado del formulario sigue siendo de izquierda a derecha.
5. Valor de retorno
El valor devuelto es el número de soluciones en la última posición de la cadena, dp[ s.size() - 1 ].
3. Escritura de código
class Solution {
public:
int numDecodings(string s) {
// 创建dp表
int size = s.size();
vector<int> dp(size);
// 初始化
dp[0] = s[0] != '0';
if(size == 1) return dp[0];
if(s[0] != '0' && s[1] != '0') dp[1]++;
int tmp = (s[0] - '0') * 10 + (s[1] - '0');
if(tmp >= 10 && tmp <= 26) dp[1]++;
for(int i = 2; i < size; i++) {
if(s[i] != '0') dp[i] += dp[i - 1]; // 单独解码
tmp = (s[i - 1] - '0') * 10 + (s[i] - '0');
if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2]; // 和前面联合解码
}
return dp[size - 1];
}
};
Escribe al final:
Lo anterior es el contenido de este artículo, gracias por leer.
Si sientes 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 ~