记忆性递归:
#include <iostream>
using namespace std;
int dp[91]={0}; //到每层的方式次数
int fun(int n){ //记忆性递归
if(dp[n]>0)
return dp[n];
int ans;
if(n==1)
ans = 1;
else if(n==2)
ans = 2; //第二个台阶有连续跳两次,和一次直接跳到2
else
ans = fun(n-1)+fun(n-2); //每个台阶可以从前一个台阶跳过来,也可以从前两个跳过来;
dp[n]=ans;
return ans;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
cout<<fun(n)<<endl;
}
return 0;
}
循环递推:
#include <iostream>
using namespace std;
int dp[91]={0}; //到每层的方式次数
int fun(int n){
if(dp[n]>0)
return dp[n];
int ans;
if(n==1)
ans = 1;
else if(n==2)
ans = 2;
else
ans = fun(n-1)+fun(n-2);
dp[n]=ans;
return ans;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
if(i==1)
dp[i] = 1;
else if(i==2)
dp[i] = 2;
else
dp[i] = dp[i-1]+dp[i-2];
}
cout<<dp[n]<<endl;
}
return 0;
}