python动态规划算法实例详解

news2025/4/7 13:40:55

文章目录

  • python动态规划算法实例详解
    • 一、什么是动态规划?
    • 二、新视角:从斐波那契数列看动态规划
    • 三、实例扩展(爬楼梯)
      • 1. 题目描述
      • 2. 示例
        • 示例1
        • 示例2
      • 3. 解析
      • 4. 代码实现
    • 四、结语

💖💖💖💕💕💕欢迎来到小刘的博客💕💕💕💖💖💖

🎁支持:如果您觉得小刘的文章对您有帮助的话,可以关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

🎉🎉Welcome to my blog!🎉🎉

📃我的CSDN博客主页:热爱科技的刘同学🌈🌈🌈




LET ' S BEGAIN





在这里插入图片描述

python动态规划算法实例详解

一、什么是动态规划?

如果大家对“动态规划”这个生僻的术语不理解的话,那就先听小刘给大家说个现实生活中的实际案例吧:

虽然现在手机是相当的便捷,还可以付款,但是最初的时候,我们经常会使用硬币,其中,我们如果遇到手中有很多五毛或者1块钱硬币,要怎么凑出来5元钱呢?凑出来5元钱的这一个过程也可以称之为动态规划算法。

二、新视角:从斐波那契数列看动态规划

斐波那契数列

F n = F n − 1 + F n − 2 ( n = 1 , 2 f i b ( 1 ) = f i b ( 2 ) = 1 ) Fn = Fn-1 + Fn-2(n = 1,2 fib(1) = fib(2) = 1) Fn=Fn1+Fn2(n=1,2fib(1)=fib(2)=1)

练习:使用递归和非递归的方法来求解斐波那契数列的第 n

代码如下:

def fibnacci(n):
  if n == 1 or n == 2:
    return 1
  else:
    return fibnacci(n - 1) + fibnacci(n - 2)
 print(fibnacci(10)) # 55
 

如果看不懂上面模棱两可的介绍,还有下面更加直观的代码:

f(1) = 1
f(2) = 1
f(3) = f(1) + f(2) = 1+ 1 = 2
f(4) = f(3) + f(2) = 2 + 1 = 3
...
f(n) = f(n-1) + f(n-2)

三、实例扩展(爬楼梯)

1. 题目描述

假设你正在爬楼梯,需要n阶才能到达楼顶,每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

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

2. 示例

示例1

输入: 2
输出: 2

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

  1. 1 阶 + 1 阶
  2. 2 阶

示例2

输入: 3
输出: 3

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

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

3. 解析

如果给的两个示例看的不是特别清楚,你可以当阶梯为0,那么上楼梯方法0种这是必然,当阶梯只有1那么上楼梯方法只有1种:

当4个台阶:

输入:4
输出:4

  1. 1阶 + 1阶 + 1阶 + 1阶
  2. 2阶 + 2阶
  3. 1阶 + 2阶 + 1阶
  4. 2阶 + 1阶 + 1阶
  5. 1阶 + 1阶 + 2阶

那么得到:

阶梯数爬楼梯方法
00
11
22
33
45

如果感觉看的不明显可以推理一下5阶,6阶…

可以得到当我们想爬n阶楼梯,我们可以得到: p ( n − 1 ) + p ( n − 2 ) p p(n-1) + p(n-2) p p(n1)+p(n2)p 为爬楼梯方法。

4. 代码实现

class Solution:
  def climbStairs(self, n: int) -> int:
    num_list = [0,1,2]
    if n==1:
      return num_list[1]
    elif n==2:
      return num_list[2]
    else:
      for i in range(3,n+1):
        num_list.append(num_list[i-1]+num_list[i-2])
    print(num_list)
    return num_list[n]

obj = Solution()
result = obj.climbStairs(10)
print(result)

提交LeetCode只击败了12.72%的人,继续优化:

class Solution:
  def climbStairs(self, n: int) -> int:
    a,b,c = 0,1,2
    if n == 1:
      return b
    if n == 2:
      return c
    while n>0:
      c = a + b
      a,b = b,c
      n -= 1
    return c
obj = Solution()
result = obj.climbStairs(8)

四、结语

今天的算法实例详解就分享到这里了,你们知道什么是动态规划了吗?🥰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

特性Attribute

浅浅了解一下,可影响程序集的运行 [Obsolete]:生成表提示,有true报错提示,无true是提醒提示 是什么:特性就是一个类(可是自定义类),这个类直接/间接继承自Attribute类,一般类名以Attribute结尾&#xff0c…

ReentrantLock与ReentrantReadWirteLock 原理

ReentrantLock原理(**) 讲解除了FairLock部分是FairLock流程,其余均NonFairLock源码 (FairLock部分会讲解两者不同) 1. NonFairLock实现原理 加锁解锁流程 先从构造器开始看,默认为非公平锁实现 public …

Commvault+XSKY 推出基于 Object Lock 的防勒索病毒联合方案

从桶粒度到对象粒度随着对象存储的普及,对象存储已经成为最流行的备份目的(backup target) 存储。XSKY星辰天合作为国内领先的对象存储厂商,Commvault 作为全球领先的数据保护厂商,双方一直有紧密的合作。特别在 2020 年&#xff…

装了我这 10 个 IDEA 神级插件后,同事也开始情不自禁的嘚瑟了

CSDN 的小伙伴,大家好,我是二哥呀。 昨天,有读者私信发我一篇 CSDN 上的文章(就是这篇😂),说里面提到的 Intellij IDEA 插件真心不错,基本上可以一站式开发了,希望能分享…

【学习笔记】《Python深度学习》第一章:什么是深度学习

文章目录1 人工智能、机器学习与深度学习1.1 人工智能1.2 机器学习1.3 从数据中学习表示1.4 深度学习之“深度”1.5 用三张图理解深度学习的工作原理2 机器学习简史2.1 概率建模2.2 早期神经网络2.3 核方法2.4 决策树、随机森林与梯度提升机2.5 回到神经网络2.6 深度学习的不同…

清华学姐三年的测试成长经历,到最后的喜提高薪offer

上个礼拜刚好转正了,三个月试用期,五月份换的工作。 现在这份工作,相比上一份确实好很多,比如工资直接涨了一倍,7到14,13薪,朝九晚六,从不加班,项目也简单,包…

计算机毕业设计(附源码)python疫情下校园食品安全信息管理

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

stm32毕业设计 单片机MP3音乐播放器

文章目录1 简介2 绪论2.1 课题背景与目的3 系统设计3.1 系统架构3.2 软件部分设计3.3 实现效果3.4 部分相关代码1 简介 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始…

【网络原理】UDP和TCP协议重点知识汇总

目录 1.UDP协议: 2.TCP协议: 1.UDP协议: UDP协议的特点:无连接、不可靠传输、面向数据报和全双工。UDP报文最大长度是2个字节,2个字节表示的范围就是0~65535,也就是64kb。所以如果需要使用UDP传输一个比…

Qt 自定义控件

学过的东西很久不用都已经忘记了,即使是很简单的事情 1、添加一个Qt 设计师界面类 如何将这个放到比较好看并且是居中的呢? 布局--》水平-》竖直 点击大的widget 不是这两个控件 2、在主窗口中添加一个widget 来加载上面我们已经拿到组合控件 3、将这个…

HTML入门零基础教程(三)

嗨,大家好,我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助,请支持一波。 希望未来可以一起学习交流。 目录 一、 VSCode工具生成骨架标签新增代码 1.文档类型声明标签 2.lang语言种类 3.charset字符集 二、HT…

从刘老师的进化的力量到有感,疫情阶段如何弯道超车

听了刘老师的内容,了解了一个公式:方向趋势不确定周期,那么JVS更能成为企业这几年实现弯道超车的助理。 方向事关企业生死,在方向上宁愿多花些时间,也不能犯错。不确定刺激企业短时间的痛,企业是需要化解短…

[Spring MVC 4] MyBatis 分页开发

在做Web开发的时候,需要对查询结果进行分页查询,初学者会使用原生的sql查询方式,例如limit关键字,不过这种属于对数据库物理分页了,然而会造成数据库本身的压力,所以分页管理就诞生了。一般在Mybatis中使用…

校园二手交易系统,二手交易网站,闲置物品交易系统毕业设计作品

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的二手交易网站系统,整个网站项目使用了B/S架构,基于java的springboot框架下开发;用户通过登录网站,查询二手交易商品,购买二手交易网站…

对于volatile的看法

volatile原意是易变的,编译器对volatile修饰的变量,当要读取这个变量时,任何情况下都会从内存中读取,而不会从寄存器缓存中读取。 编译器不会对volatile修饰的变量进行任何优化 1)非volatile变量 在这个用例中&#…

codery-why蘑菇街商城项目梳理笔记

supermallagain-学习记录 项目目录搭建 安装vue以及整理目录 样式初始化 引入assets/css/normalize.css文件 在实际开发中,经常会将浏览器默认的样式进行重置 *{margin:0;padding:0;border:0;}但是*是通配符,需要把所有的标签都遍历一遍,…

MySQL底层知识总结

MySQL数据库配置主从 三大日志 -binlog 归档日志 -redolog 重做日志 -undolog docker run --name mysql102 -p 33062:3306 -e MYSQL_ROOT_PASSWORD123 -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ciGRANT REPLICATION SLAVE ON *.* t…

Spring Bean 的生命周期(看着图不迷路)

目录 Bean的生命周期5步走系列: BeanLifeCycle类 Spring.xml 配置文件 BeanLifeTest测试方法 运行结果: Bean的生命周期7步走系列:在实例化Bean的前和后加了两步。​​​​ 定义myInstantiationAwareBeanPostProcessor 类 实现InstantiationAwar…

【JavaWeb】一文搞懂Java过滤器与拦截器的区别

✅✅作者主页:🔗孙不坚1208的博客 🔥🔥精选专栏:🔗JavaWeb从入门到精通(持续更新中) 📋📋 本文摘要:本篇文章主要分享Java过滤器与拦截器的知识。…

字节跳动测开实习生面试,拿15K过分吗?

今年9月面了字节跳动的测试开发岗(日常实习岗),2面技术面和1面hr面。拿到offer后,考虑到自己还是想保研怕成绩掉,选择留在学校,拒offer。 很幸运的是我的简历被内推到了其他部门,今年10月初字节…