动态规划之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
这里解释一下way(3)=4。爬到第3层一共有4种方式:每次爬一层,1+1+1=3;先爬一层,再爬二层,1+2=3;先爬二层,再爬一层,2+1=3;一次性爬三层。
三,代码实现
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)具体可参考:
只不过杨辉三角的计算公式有两个参数而已。
另外,相关问题可参考:组合问题与动态规划的联系之应用
动态规划之Fib数列类问题应用的更多相关文章
- FIB数列
斐波那契级数除以N会出现循环,此周期称为皮萨诺周期. 下面给出证明 必然会出现循环 这是基于下面事实: 1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+ ...
- bzoj5104: Fib数列
Description Fib数列为1,1,2,3,5,8... 求在Mod10^9+9的意义下,数字N在Fib数列中出现在哪个位置 无解输出-1 Input 一行,一个数字N,N < = 10 ...
- UVaLive 3357 Pinary (Fib数列+递归)
题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题 ...
- 【bzoj5118】Fib数列2 费马小定理+矩阵乘法
题目描述 Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2) 现给出N,求Fib(2^n). 输入 本题有多组数据.第一行一个整数T,表示数据 ...
- HDU3977 Evil teacher 求fib数列模p的最小循环节
In the math class, the evil teacher gave you one unprecedented problem! Here f(n) is the n-th fibona ...
- 1022. Fib数列
https://acm.sjtu.edu.cn/OnlineJudge/problem/1022 Description 定义Fib数列:1,1,2,3,5,8,13,…1,1,2,3,5,8,13, ...
- [bzoj5118]Fib数列2_费马小定理_矩阵乘法
Fib数列2 bzoj-5118 题目大意:求Fib($2^n$). 注释:$1\le n\le 10^{15}$. 想法:开始一看觉得一定是道神题,多好的题面啊?结果...妈的,模数是质数,费马小定 ...
- 【BZOJ5104】Fib数列(BSGS,二次剩余)
[BZOJ5104]Fib数列(BSGS,二次剩余) 题面 BZOJ 题解 首先求出斐波那契数列的通项: 令\(A=\frac{1+\sqrt 5}{2},B=\frac{1-\sqrt 5}{2}\ ...
- @bzoj - 5104@ Fib数列
目录 @description@ @solution@ @accepted code@ @details@ @description@ Fib数列为1,1,2,3,5,8... 求在Mod10^9+9 ...
随机推荐
- ASP.NET MVC缓存使用
局部缓存(Partial Page) 1.新建局部缓存控制器: public class PartialCacheController : Controller { // GET: /PartialC ...
- PGSQL 获取数据库大小以及表达小等的SQL
SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner, CASE WHEN pg_catalog.has_da ...
- CentOS7 卸载mariadb 安装mysql的过程:
1. 检查安装的mariadb rpm -qa |grep mariadb 得到已经安装的安装包 mariadb-libs-5.5.56-2.el7.x86_64mariadb-devel-5.5.5 ...
- Vue 组件化
根实例└─ TodoList ├─ TodoItem │ ├─ DeleteTodoButton │ └─ EditTodoButton └─ TodoListFooter ├─ ClearTodos ...
- React 表单受控组件
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 软件工程_1st weeks
本周为软件工程课的第一周,本周主要完成了三个工作:了解了github并使用.拜读了<构建之法>并开通了博客以及完成了四则运算的代码实现. 对于第一项工作github的安装和使用,花费了5个 ...
- Centos7安装Splash
前言 最近在用Scrapy抓取一个网站数据,其中有个页面需要执行js脚本才能加载,所以需要用到Splash. 官网地址:https://splash.readthedocs.io/en/stable/ ...
- spring cloud实战与思考(一) spring config全局配置方案设计
“spring cloud”的配置中心工具“spring cloud config”提供了分布式系统配置文件集中管理解决方案.该工具功能强大,实现也很简单.网上可以搜索到很多开发教程和用例.本文并不是 ...
- 黄金Corner
春水初生 春林初盛 春风十里 你在哪里
- BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT
题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通. 如果是则输出“no”.否则输出“yes”,并且在 ...