Subir escaleras con cálculos rápidos de potencia

¡Acostúmbrate a escribir juntos! Este es el quinto día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

Tema Descripción

Supongamos que está subiendo escaleras. Necesitas  n pasos para llegar a la cima.

Puede subir  uno 1 o  2 más escalones a la vez. ¿De cuántas maneras diferentes puedes llegar a la cima de un edificio?

imagen.png

imagen.png

análisis de pensamiento

Hay muchos algoritmos para subir escaleras, desde la recursión aprendida al principio, y el almacenamiento constante del valor pre a través de dos variables (esta idea tiene una sombra de programación dinámica, que esconde una ecuación de transición de estado, pero no necesita aplicar para un nivel adicional O(n) de espacio de memoria).

Sin embargo, la recursividad requiere una pila profunda y la complejidad temporal de la programación dinámica también es O(n) ¿Se puede reducir aún más la complejidad temporal?

Ver la siguiente fórmula

[ 1 1 1 0 ] [ f ( n ) f ( n 1 ) ] = [ f ( n 1 ) + f ( n ) f ( n ) ] = [ f ( n + 1 ) f ( n ) ] \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} f(n) \\ f(n - 1) \end{bmatrix} = \begin{bmatrix} f(n - 1) + f(n) \\ f(n) \end{bmatriz} = \begin{bmatriz} f(n + 1) \\ f(n) \end{bmatriz}

Por lo tanto

[ 1 1 1 0 ] n [ f ( 1 ) f ( 0 ) ] = [ f ( n + 1 ) f ( n ) ] \begin{bmatrix} 1 y 1 \\ 1 y 0 \end{bmatrix}^n \begin{bmatrix} f(1) \\ f(0) \end{bmatrix} = \begin{bmatrix} f(n + 1) \\ f(n) \end{bmatriz}

Entonces la complejidad temporal de este problema se simplifica a la solución

[ 1 1 1 0 ] n \begin{bmatrix} 1 y 1 \\ 1 y 0 \end{bmatrix}^n

complejidad temporal de

Para resolver esta n-ésima potencia, podemos usar la potencia rápida. Cambiar la complejidad temporal de O(n) a O( l o g 2 n registro_2n )

Código

 public int[][] pow(int[][] a, int n) {
        int[][] ret = {{1, 0}, {0, 1}};
        while (n > 0) {
            if ((n & 1) == 1) {
                ret = multiply(ret, a);
            }
            n >>= 1;
            a = multiply(a, a);
        }
        return ret;
    }
复制代码

Resumir

De hecho, personalmente creo que es suficiente usar la programación dinámica para subir escaleras, pero ocasionalmente me encuentro con algunas personas que persiguen la complejidad del tiempo o las competencias que requieren un poder rápido para responder.

La dificultad de la potencia rápida no es su implementación, sino cómo abstraer un problema en un problema que pueda resolverse utilizando la potencia rápida.

Supongo que te gusta

Origin juejin.im/post/7084231510508699685
Recomendado
Clasificación