假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2

输出: 2

解释: 有两种方法可以爬到楼顶。

1 阶 + 1 阶

2 阶

示例 2:

输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

1 阶 + 1 阶 + 1 阶

1 阶 + 2 阶

2 阶 + 1 阶

原文章主要借由 2 个问题 来讲述什么是动态规划,由浅到深,本篇主要围绕第1个问题,使用python 实现(文中使用java实现)。

第2个问题放在下一篇实现。

# 针对试题一 的解法

# 最优解 斐波拉契数列

class Solution(object):

def climbStairs(self, n):

"""

:type n: int

:rtype: int

时间复杂度: O(2^n) ; 这是一颗二叉树,树的高度 n-1 ,节点有 2^(n-1)

空间复杂度: O(2^n) ; 因为每个计算结果都要存储,而且涉及重复计算

"""

assert isinstance(n,int),"n 不是整型,请确认后重新输入"

assert (n > 0), "n 必须大于0,请确认后重新输入"

if n <= 1:

return 1

elif n == 2:

return 2

return self.climbStairs(n-1)+self.climbStairs(n-2)

def climbStairs2(self, n, record=dict()):

"""

:type n: int

:rtype: int

备忘录算法,通过一个缓存,来减少重复计算

时间复杂度: O(n) ; f1~fn 除去 1,2 确定,其他都有走一遍,即 n-2

空间复杂度: O(n) ; 同理

"""

assert isinstance(n,int),"n 不是整型,请确认后重新输入"

assert (n > 0), "n 必须大于0,请确认后重新输入"

if n <= 1:

return 1

if n == 2:

return 2

if record.keys().__contains__(n):

return record.get(n)

else:

res = self.climbStairs2(n-1,record)+self.climbStairs2(n-2,record)

record[n]= res

return res

def climbStairs3(self, n):

"""

:type n: int

:rtype: int

减少空间复杂度,自底向上

时间复杂度: O(n) ; f1~fn 除去 1,2 确定,其他都有走一遍,即 n-2

空间复杂度: O(1) ; 因为每个计算结果都要存储两个变量

"""

assert isinstance(n,int),"n 不是整型,请确认后重新输入"

assert (n > 0), "n 必须大于0,请确认后重新输入"

if n == 1:

return 1

elif n == 2:

return 2

a,b,temp = (1,2,0)

for i in range(3,n+1):

temp = a+b

a = b

b = temp

return temp

if __name__ == ‘__main__‘:

s = Solution()

# res = s.climbStairs(4)

# res = s.climbStairs2(4)

res = s.climbStairs3(4)

print(res)

思路: climbStairs函数 是原始解法,但时间及空间复杂度均很大 O(2^n), 考虑到有重复计算,

所以加个缓存备忘录 字典record, 没有的加进去,后续再遇到就直接从record中取值,没必要再递归到最底层得到结果。即 climbStairs2 函数

再进一步考虑优化 空间复杂度,自底向上,每次只保留最近的两个结果,即 climbStairs3 函数

原文:https://www.cnblogs.com/jason-Gan/p/13303601.html

python动态规划图解_动态规划案例之python实现(一)相关推荐

  1. python营业数据分析_小案例-使用python进行销售数据分析

    数据分析步骤:提出问题.理解数据.数据清洗.构建模型.数据可视化 数据:朝阳医院2018年销售数据 一.提出问题 从销售数据中分析以下业务指标:月均消费次数.月均消费金额.客单价.消费趋势 二.理解数 ...

  2. python学习图解_大牛整理!Python学习方法和学习路线,看完茅塞顿开!

    原标题:大牛整理!Python学习方法和学习路线,看完茅塞顿开! Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团 ...

  3. 请简述python数据分析流程_简单案例讲解Python数据分析的基本步骤

    上篇文章我们初步认识了numpy包和pandas包的基本用法,这篇文章就来讲一下如何利用Python做数据分析. 一.数据分析的基本步骤 1. 明确问题,理解数据 (1)先把问题了解清楚,明确分析背景 ...

  4. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  5. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  6. 视频教程-跟着王进老师学开发Python篇:基础入门案例讲解-Python

    跟着王进老师学开发Python篇:基础入门案例讲解 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥ ...

  7. python递归函数例题_递归案例python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 而对应的中文翻译 "递归" 却表达了两个意思:"递 ...

  8. python招聘广州黄埔_小案例:用Pandas分析招聘网Python岗位信息

    小案例: Python岗位分析_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 1. 读取数据 import pandas as pd import numpy ...

  9. python在教育领域的应用课题_研究型案例在Python教学方法中应用

    高勇钢 摘要:在高校开设python课程时,为了适应大数据时代对数据分析的要求,采用研究型案例教学方法增强学生计算思维能力和解决复杂专业问题的能力,并且初步掌握了研究具体问题的基本方法. 关键词:Py ...

最新文章

  1. 重磅 | 周志华最新论文:首个基于决策树集成的自动编码器,表现优于DNN
  2. Javascript的作用域,作用域链,闭包
  3. JSTL解析——001
  4. IT经理世界:专注莫如史玉柱
  5. Expression Blend实例动画-大坝水位升高演示
  6. 读取Excel文件数据
  7. php return 值_php return的用法是什么
  8. 【Java】数据结构——栈(图文)
  9. c# 中wpfexcel_VS2017下编写C#程序读写Excel文件
  10. 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手
  11. EditText控件常用属性
  12. 商业软件太贵?找开源替代品
  13. 计算机维护系统管理毕业设计,计算机系统维护-毕业论文.doc
  14. IE 主页被恶意篡改的解决方法
  15. ChemDraw怎样输入大括符?
  16. 微信小程序 —— 保留两位小数
  17. 经典同态加密算法Paillier解读 - 原理、实现和应用
  18. 一个开源经典的MCU菜单框架设计
  19. 马丁福勒《UML精粹》读书笔记_第六章
  20. 中美AI争高下的秘诀!一文看尽中国AI计算力发展

热门文章

  1. IJCAI2019报告:基于无监督学习和图学习的大数据挖掘
  2. 在 Linux/UNIX 终端下使用 nload 实时监控网络流量和带宽使用
  3. rtmp官方协议详解
  4. 自动驾驶多传感器融合
  5. OpenStack Gluon
  6. raft算法动画演示
  7. RunJar是什么进程?
  8. 利剑无意之如何判断一个数在40亿个整数中
  9. java中线程的生命周期
  10. 组合和聚合的区别,通俗易懂。