从跳台阶开始dp优化:三种解法 + 详细解读

  本题链接:821. 跳台阶 - AcWing题库

  一个楼梯共有 n级台阶,每次可以走一级或者两级,问从第 0 级台阶走到第 n 级台阶一共有多少种方案。

目录

思路:

方法一:暴力dfs

方法二:dp

方法三:dp优化

思路:

  要想解决跳台阶问题,最重要的是理解递归条件 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;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值