Supongamos que estás subiendo escaleras. Se necesitan n pasos para llegar a la cima del edificio.
Puedes subir 1 o 2 escalones a la vez. ¿De cuántas maneras diferentes puedes subir a la cima de un edificio?
Nota: Dado n es un número entero positivo.
Ejemplo 1:
Entrada: 2 Salida: 2 Explicación: Hay dos formas de subir a la cima del edificio.
- 1er nivel + 1er nivel
- Nivel 2
Ejemplo 2:
Entrada: 3 Salida: 3 Explicación: Hay tres formas de subir a la cima del edificio.
- 1er nivel + 1er nivel + 1er nivel
- Nivel 1 + Nivel 2
- Nivel 2 + Nivel 1
Este problema es un problema típico de programación dinámica. El enésimo paso solo puede subir desde el paso n-1 o n-2. La forma de ir al paso n-1 + la forma de ir al paso n-2 = la forma de ir al paso n. Ya conoces la forma de ir al paso 1 y 2, y puedes agregarlos. por el camino.
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
Este programa tiene la misma idea general que el programa C++ anterior, excepto que su bucle comienza desde el primer paso.
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;
}
}
lenguaje c
En el método anterior, hemos discutido que f(n)f(n) es una recurrencia lineal homogénea. Según la ecuación de recurrencia f(n) = f(n - 1) + f(n - 2)f(n) =f (n−1)+f(n−2), podemos escribir la ecuación característica así:
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);
}