Problema de incremento (diseño recursivo)

Pregunta: Hay n escalones en la escalera. Uno, dos o tres pasos se pueden dar en un solo paso. ¿Cuántas maneras de subir las escaleras?

Implementación de código:

#include<iostream>
using namespace std;

int cnt=0;//用于计数
void f(int n)//n表示还剩你个台阶需要走
{
    if(n<0) return; //防止死循环
    if(n==0)
    {
        cnt++;
        return;
    }
    f(n-1); //走一步
    f(n-2); //走两步
    f(n-3); //走三步
}
int main()
{
    int n;
    cin>>n;
    f(n);
    cout<<cnt;
    return 0;
}

Defectos: cuando n es relativamente grande, lleva mucho tiempo e incluso puede reventar la pila. El análisis muestra que hay muchos subproblemas repetitivos en la recursión anterior, y se realiza mucho trabajo inútil. Para resolver el subproblema repetitivo, la recursividad de la memoria se puede utilizar para la optimización.

Implementación de código:

#include<iostream>
using namespace std;


int dp[1001];//假设楼梯的台阶数可以达到1000
int f(int n)//n表示还剩你个台阶需要走
{
    if(dp[n]!=0) return dp[n];
    int cnt=0;//用于计数
    if(n<0) return 0; //防止死循环
    if(n==0)
    {
        cnt++;
        return cnt;
    }
    cnt+=f(n-1); //走一步
    cnt+=f(n-2); //走两步
    cnt+=f(n-3); //走三步
    dp[n]=cnt;
    return cnt;
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}
Publicado 15 artículos originales · elogiado 6 · visitas 38

Supongo que te gusta

Origin blog.csdn.net/weixin_46165788/article/details/105520672
Recomendado
Clasificación