Supposons que vous montiez des escaliers. Il vous faut n marches pour atteindre le sommet du bâtiment.
Vous pouvez monter 1 ou 2 marches à la fois. De combien de manières différentes peut-on grimper au sommet d’un immeuble ?
Remarque : Étant donné que n est un entier positif.
Exemple 1:
Entrée : 2 Sortie : 2 Explication : Il existe deux façons de grimper au sommet du bâtiment.
- 1er niveau + 1er niveau
- Niveau 2
Exemple 2 :
Entrée : 3 Sortie : 3 Explication : Il existe trois façons de grimper au sommet du bâtiment.
- 1er niveau + 1er niveau + 1er niveau
- Niveau 1 + Niveau 2
- Niveau 2 + Niveau 1
Ce problème est un problème typique de programmation dynamique. La nième marche ne peut remonter qu'à partir de la n-1 ou de la n-2ème marche. Le chemin pour aller à la n-1ème étape + le chemin pour aller à la n-2ème étape = le chemin pour aller à la n-ième étape. Vous connaissez déjà le chemin pour aller à la 1ère et à la 2ème étape, et vous pouvez les ajouter le long du chemin.
f(x)=f(x−1)+f(x−2)
c++
class Solution {
public:
int climbStairs(int n) {
if(n == 1){
return 1;}
if(n == 2){
return 2;}
int a = 1, b = 2, temp;
for(int i =3; i <= n; i++){
temp = a;
a = b;
b = temp + b;
}
return b;
}
};
Java
Ce programme a la même idée générale que le programme C++ ci-dessus, sauf que sa boucle démarre dès la première étape.
class Solution {
public int climbStairs(int n) {
if(n < 3){
return n;
}
int p = 0, q = 0 , r = 1;
for(int i = 1; i <= n; i++){
p = q;
q = r;
r = p + q;
}
return r;
}
}
langage C
Dans la méthode précédente, nous avons discuté du fait que f(n)f(n) est une récurrence linéaire homogène. Selon l'équation de récurrence f(n) = f(n - 1) + f(n - 2)f(n) =f (n−1)+f(n−2), on peut écrire l'équation caractéristique comme ceci :
int climbStairs(int n){
double sqrt5 = sqrt(5);
double fibn = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1);
return (int) round(fibn / sqrt5);
}