Subir escaleras (Java/C/C++)

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.

  1. 1er nivel + 1er nivel
  2. Nivel 2

Ejemplo 2:

Entrada: 3 Salida: 3 Explicación: Hay tres formas de subir a la cima del edificio.

  1. 1er nivel + 1er nivel + 1er nivel
  2. Nivel 1 + Nivel 2
  3. 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í:
Insertar descripción de la imagen aquíInsertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

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);
}

Supongo que te gusta

Origin blog.csdn.net/smile66688/article/details/120354501
Recomendado
Clasificación