本题链接:821. 跳台阶 - AcWing题库
一个楼梯共有 n级台阶,每次可以走一级或者两级,问从第 0 级台阶走到第 n 级台阶一共有多少种方案。
目录
思路:
要想解决跳台阶问题,最重要的是理解递归条件 f(n) = f(n - 1)+ f(n - 2),其中 f(n)是第n个台阶时的方案数, 因为每次只能走一或两级,因此第n级只可能是从第n - 1级或n - 2级走上来的,也就是第n级台阶方案数为第n - 1级和n - 2级之和,
方法一:暴力dfs
根据递归条件可直接写出该解法
#include<iostream>
using namespace std;
int dfs(int x){
if(x == 1) return 1;
if(x == 2) return 2;
return dfs(x - 1) + dfs(x - 2);
}
int main(){
int n;
cin >> n;
cout << dfs(n);
return 0;
}
方法二:dp
对dfs进行优化,用一个数组 f 来存储第n个台阶时的方案数
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int f[20];
f[1] = 1;
f[2] = 2;
for(int i = 3;i <= n;i++){
f[i] = f[i - 1] + f[i - 2];
}
cout << f[n];
return 0;
}
方法三:dp优化
由递归公式 f(n) = f(n - 1)+ f(n - 2)可以看出,它只与第n - 1级和n - 2级有关,因此可以设置三个变量 newF , temp1,temp2,分别用于存储 f(n),f(n - 2)和 f(n - 1),用三个变量来代替数组f的存储。这是一个动态滚动的过程,三个变量在不断变化之中,此处理解建议多花费时间,
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int newF = 0;
int temp1 = 1;
int temp2 = 2;
for(int i = 3;i <= n;i++){
newF = temp1 + temp2;
temp1 = temp2;
temp2 = newF;
}
if(n == 1) printf("1");
if(n == 2) printf("2");
if(n >= 3) printf("%d",newF);
return 0;
}