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