Monter des escaliers avec des calculs de puissance rapides

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 ?

image.png

image.png

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

[ 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{bmatrice} = \begin{bmatrice} f(n + 1) \\ f(n) \end{bmatrice}

Donc

[ 1 1 1 0 ] n [ f ( 1 ) f ( 0 ) ] = [ f ( n + 1 ) f ( n ) ] \begin{bmatrice} 1 & 1 \\ 1 & 0 \end{bmatrice}^n \begin{bmatrice} f(1) \\ f(0) \end{bmatrice} = \begin{bmatrice} f(n + 1) \\ f(n) \end{bmatrice}

Alors la complexité temporelle de ce problème se simplifie à la solution

[ 1 1 1 0 ] n \begin{bmatrice} 1 & 1 \\ 1 & 0 \end{bmatrice}^n

complexité temporelle de

Pour résoudre cette puissance n, on peut utiliser la puissance rapide. Changer la complexité temporelle de O(n) en O( l o g 2 n log_2n )

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.

Je suppose que tu aimes

Origine juejin.im/post/7084231510508699685
conseillé
Classement