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

news/2023/6/6 3:50:46

文章目录

  • 前言
  • 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.exyb.cn/news/show-4558941.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

b站视频能外链吗html,Iframe代码嵌入BiliBili视频外链

Loading...html//默认外链html//BILIBILI 地址PC端参数&high_quality1 (1最高画质 0最低画质)&danmaku0 (1打开弹幕 0关闭弹幕)htmlallowfullscreen"allowfullscreen" #移动端全屏sandbox"allow-top-navigation allow-same-origin allow-formsallow-scr…

网络协议编程时间服务器改为,网络程序设计复习整理

1. OSI/RM(七层)结构应用层表示层会话层传输层网络层数据链路层物理层2.各层网络编程的关键技术应用层:网站系统设计、C/S系统设计C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构&#xff…

Node js 开发入门 —UDP 编程,小白也能轻松学会

UDP 协议 UDP 协议(无连接传输协议)是运行在运输层之上,能够为调用它的应用程序提供一种无需建立连接就可以直接发送数据包的网络传输协议;它主要有以下两个特点: 无连接: 不同于 TCP 在数据传输之前需要…

你真的了解“手机端的 C/S架构 向 B/S架构 迁移”吗

首先我们需要了解下C/S架构和B/S架构的概念及优缺点QWQ 目录 C/S架构 概念: 优点: 缺点: B/S架构 概念: 优点: 缺点: 实例1:QQ是B/S还是C/S 实例2:微信小程序(…

【毕设课设】教务系统项目spring+springMVC+myBatis 与微信小程序开发(可分开运行)

教务管理系统是完成学生管理、用户管理、校建管理、课程管理、教师管理、成绩管理、校内新闻、选课管理和教评管理九大管理模块,由教务工作人员系统给管理员、教师、以及学生多用户角色,各用户依据自己角色的不同而操作不同的功能模块,教务工…

零基础如何上手APICloud App、小程序多端开发

业务需求变化快、开发人员成本高是现在企业面临的主要问题。多端开发技术则可以很好的解决这些问题,开发一次可以生成iOS、Android、小程序、Web等多端应用。APICloud凭借多年的移动开发技术积累,为开发者提供了一套高性能的多端开发技术,可以…

【UNCTF】逆向WriteUp以及出题笔记

【UNCTF】逆向WriteUp以及出题笔记WriteUpre_checkin反编译babypyeasyMazeICUezRustbase_on_rustTrapezreezvmBetterCPU出题笔记CTFilter原神WriteUp re_checkin IDA打开,搜索字符串 查看交叉引用,定位到主函数 可以看到直接比较字符串 由于Str2在I…

留给徒弟

欢迎HkEndless1我的&#xff1a;收件箱资源博客空间设置|帮助|退出 CSDN首页资讯论坛博客下载搜索 更多 CTO俱乐部学生大本营培训充电移动开发软件研发云计算程序员ITeye<>TUP 生成帖子置顶取消置顶推荐取消推荐锁定解锁移动编辑删除帖子加分帖子高亮取消高亮 结 帖发 …