[Aprendizaje de programación dinámica] Método de decodificación (4)

Tabla de contenido

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

1. Análisis del tema

2. Principio del algoritmo

1. Representación de estado

2. Ecuación de transición de estado

3. Inicialización

4. Orden de llenado

5. Valor de retorno

3. Escritura de código

Escribe al final:


¿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 ~

Supongo que te gusta

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