动态规划之Fib数列类问题应用

简介:

一,问题描述

有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶或者3阶。走到N阶楼梯,一共有多少种走法?

 

二,问题分析

DP之自顶向下分析方式:

爬到第N阶楼梯,一共只有三种情况(全划分,加法原理),从第N-1阶爬1阶到第N阶;从第N-2阶爬2阶到第N阶;从第N-3爬3阶到第N阶

故:way(N)=way(N-1)+way(N-2)+way(N-3)

这与求Fib数列非常相似,当然,其他类似的问题也可以这样求解。

初始条件:

way(1)=1

way(2)=2

way(3)=4

 

三,代码实现

复制代码
public class WaysOfLadder {
    
    public static int ways(int n){
        if(n <= 0)
            throw new IllegalArgumentException();
        return waysLadder(n);
    }
    
    //递归算法爬上第n阶楼梯一共需要多少种方式
    private static int waysLadder(int n){
        assert n > 0;
        //base condition
        if(n == 1)
            return 1;
        if(n == 2)
            return 2;
        if(n == 3)
            return 4;
        else
            return waysLadder(n-1) + waysLadder(n - 2) + waysLadder(n - 3);
    }
    
    //dp
    public static int ways_dp(int n){
        if(n <= 0)
            throw new IllegalArgumentException();
        
        int pre_1 = 1;
        int pre_2 = 2;
        int pre_3 = 4;
        int res = 0;
        for(int i = 4; i <= n; i++)
        {
            res = pre_1 + pre_2 + pre_3;
            pre_1 = pre_2;
            pre_2 = pre_3;
            pre_3 = res;
        }
        return res;
    }
    
    public static void main(String[] args) {
        int n = 32;
        System.out.println(ways_dp(n));
        System.out.println(ways(n));
    }
}
复制代码

上面代码清晰地对比了DP实现与递归实现的方式。DP是用三个变量保存当前计算的结果,当计算下一个结果时,先“查表”再计算。而递归则是使用三个递归函数调用,递归函数调用计算了大量的重叠的子问题,每次递归调用都要压栈、出栈。递归的时间复杂度为O(3^N),而DP的时间复杂度为O(N)

 

类似的思想,还有计算杨辉三角的公式:C(n,r)=C(n-1,r) + C(n-1,r-1)具体可参考

只不过杨辉三角的计算公式有两个参数而已。

另外,相关问题可参考:组合问题与动态规划的联系之应用


本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5699494.html,如需转载请自行联系原作者

相关文章
|
Linux 异构计算 Windows
Windows操作系统:指定网卡ping连通性
某些时候,板卡上留有两个及以上万兆网口,在没有其他FPGA板卡或者只是想测一下网口或者万兆光模块的通路时,可以通过回环互ping来验证下连通性
4171 0
|
机器学习/深度学习 编解码 PyTorch
CVPR 2023 | 主干网络FasterNet 核心解读 代码分析
本文分享来自CVPR 2023的论文,提出了一种快速的主干网络,名为FasterNet。核心算子是PConv,partial convolution,部分卷积,通过减少冗余计算和内存访问来更有效地提取空间特征。
10246 58
|
并行计算 编译器 C#
"CMake高手进阶秘籍:解锁高级技巧,实践最佳策略,让你的项目构建如丝般顺滑,效率飙升!"
【8月更文挑战第11天】CMake是现代软件开发的关键构建系统,其跨平台与灵活配置特性简化了复杂项目的构建流程。本文探讨CMake的高级技巧与最佳实践,包括升级至最新版本以利用新功能;采用面向目标的编程方法,增强项目清晰度与可维护性;运用CMake预设统一多平台构建配置;掌握调试技巧快速定位问题;集成代码检查与格式化工具保障代码质量;以及启用并行构建提升构建效率。通过这些策略,开发者能够更高效地管理大型项目。
369 3
|
中间件 Go 开发工具
Goland中使用GoPlantUml生成ER关系图
配置GoPlantUml环境,在Goland中生成ER关系图等,帮助开发小伙伴高效、友好地阅读和分析源码结构。
711 1
Goland中使用GoPlantUml生成ER关系图
Winform控件优化之双层Form利用Opacity实现Layer遮罩层
对于完全由自己控制实现的桌面应用来说,则可以想办法实现遮罩整个窗体(窗口)的Layer层。下面介绍在Winform中利用Form做遮罩层的实现,推荐的还是第二种方式:双Form的遮罩层....
473 0
Winform控件优化之双层Form利用Opacity实现Layer遮罩层
|
存储 应用服务中间件
IDEA设置Tomcat访问虚拟路径
IDEA设置Tomcat访问虚拟路径
568 0
IDEA设置Tomcat访问虚拟路径
|
算法 Java Linux
ZGC垃圾收集器
ZGC垃圾收集器
581 0
ZGC垃圾收集器
|
数据挖掘 程序员 数据库
聊一聊项目中的软删除
聊一聊项目中的软删除
458 0
|
人工智能 C++
【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)(上)
【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
537 0
【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)(上)
|
机器学习/深度学习 弹性计算 虚拟化
阿里云服务器ECS通用型g5和g6有什么区别?应该如何选择?
阿里云在官方活动中,对于通用型实例的云服务器ECS,主要推荐的是g5和g6这两个实例,那么阿里云服务器ECS通用型g6和通用型g5实例有什么区别?我们又该如何选择呢?本文来说说通用型g6和通用型g5的区别以及选择方法:
882 0
阿里云服务器ECS通用型g5和g6有什么区别?应该如何选择?