【零基础】学python数据结构与算法笔记14-动态规划

news2024/11/13 16:35:04

文章目录

  • 前言
  • 88.动态规划介绍
  • 89.钢条切割问题
  • 90.钢条切割问题:自顶向下实现
  • 91.钢条切割问题:自底向上实现
  • 92.钢条切割问题:重构解
  • 93.最长公共子序列
  • 最长公共子序列:实现
  • 总结


前言

学习python数据结构与算法,学习常用的算法,
b站学习链接

88.动态规划介绍

动态规划在基因测序、基因比对、hmm 有应用场景。

从斐波那契数列看动态规划
在这里插入图片描述
练习: 使用递归和非递归的方法来求解斐波那契数列。

在这里插入图片描述
这种非递归求斐波那契数,可以看成是一个动态规划思想,每次都会把重复子问题的答案存起来。

89.钢条切割问题

在这里插入图片描述
在这里插入图片描述
长度为n的一共有n-1口可以切,每一口可以选择切或者不切,所以有2^n-1种不同的方法。

在这里插入图片描述
r[i]那行是长度为i时,最多买的钱。可以这样考虑,在长度为2时,可以选择切成1和1 或者不切,不切最大利润是5,切了后最大利润是2,把最大利润存到r[2]下,当r[3]时,可以不切或者切成1和2(不考虑切成1、1、1,因为在r[2]中已经考虑过1和1 的利润没2大),选择最大的8存放在r[3]中,按照这样的思想,比方说看r[9],看不切或1和8或2和7或3和6或4和5,选择最大的放到r[9],
先看1和8,1+22
2和7,5+18
3和6,8+17
4和5,10+13
于是我们可以推出递推式,不切和切一刀之后最大值就是利润最大。此时从左边往右边切和从右边往左切是一样的,但我们还是考虑了切成5和4,切成6和3的情况。
在这里插入图片描述
我们可以将求解规模为n的原问题划分成规模更小的子问题:完成一次切割后,可以将产生的两端钢条看成两个独立的钢条切割问题,

在这里插入图片描述
这就叫最优子结构,把9的最大=3最大+6最大。

此时可以得出以上的递推式,不过还可以再进行简化,以上是不切和切一次的不同位置来构成的递推式。
在这里插入图片描述
这样还是切9, 左边一部分是不切的,所以价值是原来不切的价值
1和8,1+20
2和7,5+18
3和6,8+17
4和5,9+13
5和4,10+10
6和3,17+8
7和2,17+5
8和1,20+1
25还是最大,为什么可以这样做呢?因为现在最大是3和6 实则是3和6,但假设如果最大是23 那就是2和2和2和3,2没切,后面的7切成了三段,或者假设说是4和5,4没切,5切成2和3,那么就是说,这样左边没切,右边切,所有的情况还是都能列举,之前的方法有重复了,所以可以这样简化。

90.钢条切割问题:自顶向下实现

对照上面的公式写出以下两种实现,第二种简化的方法,少了一次递归,时间上少了很多。
在这里插入图片描述
将p改成p = [0,1,5,8,9,10,17,17,20,24,30,31,33,35,36,40,41,42,45,46,50],长度改大,计算最大的时间也变慢了。

在这里插入图片描述
因为递归算法由于重复求解相同子问题,效率极低,随着长度越大,求解速度会变慢
在这里插入图片描述
因为这是用了自顶向下递归实现,为何自顶向下递归的效率会这么差?
时间复杂度为O(2^n),如果n越大,就会造成指数爆炸。
求f(4),会重复求许多相同的问题。
在这里插入图片描述

动态规划的思想:每个问题只求解一次,保存求解结果
之后需要此问题时,只需要查找并保存结果。

91.钢条切割问题:自底向上实现

动态规划就是自底向上实现,每次都把最好的存起来,调用时直接取出来,不用再算。
按照第二种简化的方法写。
在这里插入图片描述
时间上比递归的方法快很多,时间复杂度为O(n^2)
在这里插入图片描述

92.钢条切割问题:重构解

如何修改动态规划算法,使其不仅输出最优解,还输出最优切割方案?
对每个问题,保存切割一次时左切切下的长度,s[i]为保存的当前最优利润时,左切下的长度
在这里插入图片描述
max()的话就不知道里面左边不切割的长度是多少,所以要换成以下写法
在这里插入图片描述
实际上这样把每次切出来的长度列出来,有个专有的名词叫路径带回
在这里插入图片描述
什么问题可以用动态规划方法?涉及到最大,最小,最优时
z
实际上,贪心算法是动态规划一个特例,贪心能解动态也能解,贪心不能解,动态也能解。
可以先从递归的思想想问题,如果递归能解就意味着动态规划能解。

93.最长公共子序列

在这里插入图片描述
首先要找到递推式或者说是最优子结构。
我们发现这样一个规律,如果两个字符串的最后一个字符不相等,比如说“ABCBDAB”和“BDCABA”这两个字符串找最长公共子序列。我们先看最后一个字符,不一样,那么我们可以等同于“ABCBDAB”和“BDCAB”中找最长公共子序列,或者“ABCBDA”和“BDCABA”中找,两者中哪个最长就是最长的公共子序列。如果最后一个字符一样,比如“ABCBDA”和“BDCABA”,那么最长的公共子序列就等于“ABCBD”和“BDCAB”的最长公共子序列 +1(因为最后一个字符相等)。
就得出如下定理:
在这里插入图片描述
安照这个图得出,空字符时都为0,如果末尾字符相等,那就取上面格子和下面格子的最大值,如果不相等,就取左上角一个格子的值+1。(从左上角过来的值代表匹配)
在这里插入图片描述

最长公共子序列:实现

首先求最长公共子序列的长度
在这里插入图片描述
再利用回溯法得出,这个最长的子序列的字符是多少
在这里插入图片描述
这种做法只能求得一个,如果 elif c[i-1][j] > c[i][j-1]: 改成 >= 则答案是BCBA,这两个都是最长公共子序列,所以都是对的。
存的路径如下。
在这里插入图片描述

总结

学习了动态规划算法。

文章目录

  • 前言
  • 88.动态规划介绍
  • 89.钢条切割问题
  • 90.钢条切割问题:自顶向下实现
  • 91.钢条切割问题:自底向上实现
  • 92.钢条切割问题:重构解
  • 93.最长公共子序列
  • 最长公共子序列:实现
  • 总结


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

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

相关文章

CSS+JS 弹窗

弹窗 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>弹窗</title><style type"text/css">.alert {display: none;justify-content: center;align-items: center;width: 100%;height: 100vh;backgro…

输入一个url后发生了什么 js性能优化

文章目录从一道题开始&#xff1a;输入一个url后发生了什么&#xff1f;1.请求协议可聊点1&#xff1a;http协议相关> 追问: http与TCP可聊点2&#xff1a; https协议相关> 追问&#xff1a;http与https2.域名解析3.web服务器4.服务(2、3)涉及到 网络优化5.浏览器渲染6.脚…

【Zookeeper】关于windows安装问题整理汇总

文章目录常规安装&#xff1a;1、windows配置zoo.cfg之后&#xff0c;提示&#xff1a;JAVA_HOME is not set.1.1 本地没有安装JDK或者没有配置JAVA_HOME解决方案&#xff0c;参考JDK安装下载办法1.2 本地配置的JDK但是环境变量JDK路劲不叫名字“JAVA_HOME”解决方案&#xff1…

docker容器将系统盘空间占满的解决办法

最近遇到一个问题&#xff0c;线上服务器的系统盘空间被占满了&#xff0c;导致服务不能正常运行了。docker启动时会报出下面这个错误no space left on device排查用到的命令&#xff0c;显示当前路径下占用空间超过1G的文件或文件夹du -h --max-depth1|grep G|sort -n经过一番…

SAP FICO 详细解析新总账功能 - 平行分类账配置

平行分类账配置 其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。 【配置流程】 1、定义总账会计核算的分类账 账套可以有多个&#xff0c;但是主分类账有且只有一个。 表FAGLFLEXT就是存储所有财务分类账发生额数据的汇总表。 勾选多个“主…

CSS知识梳理

CSS的三大特性 一 . 层叠性 : 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则 : 样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&#xff0c…

在Azure应用程序按指定时区的时间来输出日志(NLog)

部署在Azure应用程序使用NLog组件进行日志输出&#xff0c;如购买的Azure云是国际版&#xff08;非中国版Azure&#xff09;&#xff0c;默认使用国标时间&#xff08;即&#xff1a;UTC&#xff09;来输出日志时间&#xff0c;与中国地区的时间相差8小时&#xff08;即&#x…

NodeJs使用mysql.createPool连接池

1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABASE mydb1; mysql> SHOW DATABASES; -------------------- | Database | -------------------- | information_schem…

客快物流大数据项目(一百零三):快递追踪需求介绍

文章目录 快递追踪需求介绍 ​​​​​​​前言 背景介绍 快递追踪需求介绍 ​​​​​​​前言

Juicesync实现对腾讯云CHDFS存储的数据迁移

文章目录前言一、Juicesync准备二、Hadoop准备三、迁移实验四、实现思路前言 近年来&#xff0c;云计算越来越流行&#xff0c;企业从自身利益出发&#xff0c;或是不愿意被单一云服务商锁定&#xff0c;或是业务和数据冗余&#xff0c;或是出于成本优化考虑&#xff0c;会尝试…

Electron + vite + vue3简单实现

文章目录一、创建Electron应用程序1. 初始化vite项目2. 安装electron3. 修改配置文件4. 编写electron文件5. npm run dev 运行二、打包1. 安装包2. 配置打包脚本3. 渲染进程和主进程的通信渲染进程主进程一、创建Electron应用程序 Electron官网 1. 初始化vite项目 npm creat…

【区块链技术前沿】可下载内容与NFT

发表时间&#xff1a;2022年3月29日 信息来源&#xff1a;coingeek.com 目前&#xff0c;DLC&#xff08;可下载内容&#xff09;仍然是备受争议的话题&#xff0c;但却是电子游戏世界在2010年代选择的一个非常成功的市场方向。许多游戏玩家继续抱怨着电子游戏发行商在敲诈用户…

认识Panda3D引擎bam相关命令

看一下Panda自带命令&#xff0c;其中有bam相关的&#xff0c;来了解一下&#xff1b; 输入一个命令看一下&#xff0c;提示需要输入一个bam文件名&#xff1b; 查一下&#xff0c;查到一个介绍一种bam文件的资料如下&#xff0c; SAM (Sequence Alignment/Map) 格式是一种通用…

Springboot +Shiro +VUE 前后端分离式权限管理系统

前言前后端分离&#xff0c;一般都是通过token实现&#xff0c;本项目也是一样&#xff1b;用户登录时&#xff0c;生成token及 token过期时间&#xff0c;token与用户是一一对应关系&#xff0c;调用接口的时候&#xff0c;把token放到header或 请求参数中&#xff0c;服务端就…

ROS2机器人编程简述humble-第二章-Publishing and Subscribing .3.2

ROS2机器人编程简述humble-第二章-Controlling the Iterative Execution .3.1官方示例pub和sub使用std_msgs/msg/string.hpp&#xff0c;数据类型std_msgs::msg::String。这本书中使用是std_msgs/msg/int32.hpp&#xff0c;数据类型&#xff1a;std_msgs::msg::Int32。对于机器…

Servlet —— Servlet API

JavaEE传送门JavaEE Servlet —— Tomcat, 初学 Servlet 程序 Servlet —— Smart Tomcat,以及一些访问出错可能的原因 目录Servlet APIHttpServletHttpServletRequest获取 GET 请求中的参数获取 POST 请求的参数HttpServletResponseServlet API 虽然 Servlet 提供的类和方法…

【UE4 第一人称射击游戏】53-制作烟雾弹

上一篇&#xff1a;【UE4 第一人称射击游戏】52-手榴弹攻击丧尸本篇效果&#xff1a;按F键掷出烟雾弹&#xff0c;伴随产生音效和烟雾效果本篇步骤&#xff1a;拷贝一份“GrenadeActor”命名为“SmokeGrenadeActor”双击打开“SmokeGrenadeActor”&#xff0c;删除如下节点改变…

尚医通-医院详情功能(二十七)

目录&#xff1a; &#xff08;1&#xff09;前台用户系统-医院详请-情接口开发 &#xff08;2&#xff09;前台用户系统-技术点-nuxt路由 &#xff08;3&#xff09;前台用户系统-医院详情-前端整合 &#xff08;1&#xff09;前台用户系统-医院详-情接口开发 现在做在页面…

13 Java异常(异常过程解析、throw、throws、try-catch关键字)

文章目录13 异常13.1 异常概念13.2 异常的产生过程解析13.3 异常的阐释和处理13.3.1 throw关键字13.3.2 throws关键字13.3.3 try-catch代码块13.3.4 try-catch-finally代码块Java中final、finally和finalize相似点和区别13.3.5 自定义异常13 异常 13.1 异常概念 异常&#xff…

SpringCloud(12):Zuul路由网关

1 为什么需要服务网关 在分布式系统系统中&#xff0c;有商品、订单、用户、广告、支付等等一大批的服务&#xff0c;前端怎么调用呢&#xff1f;和每个服务一个个打交道&#xff1f;这显然是不可能的&#xff0c;这就需要有一个角色充当所有请求的入口&#xff0c;这个角色就是…