Prenez l'habitude d'écrire ensemble ! C'est le 5ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .
Description du sujet
Supposons que vous montez des escaliers. Vous avez besoin n
d'étapes pour arriver au sommet.
Vous pouvez monter une 1
ou 2
plusieurs marches à la fois. Combien de façons différentes peut-on atteindre le sommet d'un immeuble ?
Analyse de la pensée
Il existe de nombreux algorithmes pour monter les escaliers, depuis la récursivité apprise au début, et le stockage constant de la valeur pré à travers deux variables (cette idée a une ombre de programmation dynamique, qui cache une équation de transition d'état, mais n'a pas besoin de s'appliquer pour un niveau O(n) supplémentaire d'espace mémoire).
Cependant, la récursivité nécessite une pile profonde et la complexité temporelle de la programmation dynamique est également O (n).La complexité temporelle peut-elle être encore réduite?
Voir la formule suivante
Donc
Alors la complexité temporelle de ce problème se simplifie à la solution
complexité temporelle de
Pour résoudre cette puissance n, on peut utiliser la puissance rapide. Changer la complexité temporelle de O(n) en O( )
Code
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;
}
复制代码
Résumer
En fait, je pense personnellement qu'il suffit d'utiliser la programmation dynamique pour monter les escaliers, mais je rencontre parfois des personnes qui recherchent la complexité du temps ou des compétitions qui nécessitent une puissance rapide pour répondre.
La difficulté de la puissance rapide n'est pas sa mise en œuvre, mais comment résumer un problème en un problème qui peut être résolu en utilisant la puissance rapide.