¡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?
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
Por lo tanto
Entonces la complejidad temporal de este problema se simplifica a la solució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( )
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.