动态规划——DP算法(DynamicPrograming)我的明天不是梦

一、斐波那契数列(递归VS动态规划)

1、斐波那契数列——递归实现(python语言)——自顶向下

递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内存爆满。

1deffib(n):2#终止条件,也就是递归出口3ifn==0orn==1:4return15else:6#递归条件7return(fib(n-1)+fib(n-2))2、斐波那契数列——动态规划实现(python语言)——自底向上

动态规划——将需要重复计算的问题保存起来,不需要下次重新计算。对于斐波那契数列,算法复杂度为O(n)。

1defdp_fib(n):2#初始化一个数组,用于存储记录计算的结果。3res=[None]*(n+1)4#前两项设置为1。5res[0]=res[1]=16#自底向上,将计算结果存入数组内。7foriinrange(2,(n+1)):8res[i]=res[i-1]+res[i-2]9returnres[n]3、方法概要

(2)为这些子问题做索引,以便于它们能够在表中更好的存储与检索(用数组存储)。

(3)以自底向上的方法来填写这个表格;首先填写最小的子问题的解。

(4)这就保证了当我们解决一个特殊的子问题时,可以利用比它更小的所有可利用的子问题的解。

二、动态规划算法——思想简介

1、DP算法思想

(1)将待求解的问题分解称若干个子问题,并存储子问题的解而避免计算重复的子问题,并由子问题的解得到原问题的解。

(2)动态规划算法通常用于求解具有某种最有性质的问题。

(3)动态规划算法的基本要素:最优子结构性质和重叠子问题。

最优子结构性质:问题的最优解包含着它的子问题的最优解。即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次的决策产生)的最优决策。

重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些问题被反复计算多次。对每个子问题只解一次,然后将其解保存起来,

以后再遇到同样的问题时就可以直接引用,不必重新求解。

2、DP算法——解决问题的基本特征

(1)动态规划一般求解最值(最优、最大、最小、最长)问题;

(2)动态规划解决的问题一般是离散的,可以分解的(划分阶段的)。

(3)动态规划结局的问题必须包含最优子结构,即可以有(n-1)的最优推导出n的最优。

3、DP算法——解决问题的基本步骤

动态规划算法的四个步骤:

(1)刻画最优解的结构特性。(一维、二维、三维数组);

(2)递归的定义最优解。(状态转移方程)

(3)以自底向上的方法来计算最优解。

(4)从计算得到的解来构造一个最优解。

4、求解例子——求阶乘n!

1#递归实现求阶乘2defmultiply(n):3ifn==0orn==1:4return15returnn*multiply(n-1)678#动态规划实现求阶乘9defdp_multiply(n):10temp=[None]*(n+1)11temp[0]=112temp[1]=113foriinrange(2,n+1):14temp[i]=i*temp[i-1]15returntemp[n]三、动态规划——常见例题

1、求解最长不降子序列

(1)方法一:普通方法,算法复杂度为O(n^2)。

假设原始的数列为数组a

分析:

刻画结构特性:用F[i]表示前i项最长不下降子序列的长度;

状态转移方程:如果a[i]>=a[j],F[i]=max(F[i],F[j]+1)其中,0<=j

数据存储:自底向上求解最小子结构最优解存入数组

其中,pre[i]表示以元素a[i]为结尾的最长不降序列的前一个元素索引(也就是以a[i]结尾的最长不降序列的倒数第二个元素)。存储这个值是为了方便输出最长的不降序列。

1defLongest_Increaseing(a):2F=[1]*len(a)3pre=[0]*len(a)4foriinrange(1,len(a)):5forjinrange(i):6ifa[i]>=a[j]:7F[i]=max(F[i],F[j]+1)8pre[i]=j9returnF,pre10a=[5,2,8,6,3,6,9,7]11F,pre=Longest_Increaseing(a)#这里只是能获得两个数组,其中F[i]的最大值就是最长不降序列的长度。接下来,输出最长的不降序列的元素值,请看下面的代码:

1defLongest_Increaseing(a):2F=[1]*len(a)3pre=[0]*len(a)4foriinrange(1,len(a)):5forjinrange(i):6ifa[i]>=a[j]:7F[i]=max(F[i],F[j]+1)8pre[i]=j9returnF,pre10a=[5,2,8,6,3,6,9,7]11F,pre=Longest_Increaseing(a)1213#最长序列的索引14k=F.index(max(F))15#输出序列的列表16result=[None]*F[k]17flag=True18Len=F[k]19whileflag:20result[Len-1]=a[k]21k=pre[k]22ifk==0:23flag=False24Len-=125print(result)#输出结果:[2,3,6,9]

2、求解最长的公共子序列

求解最长公共子序列代码如下(python语言):

1importnumpyasnp2defLCS(str1,str2):3#获取两个序列的长度4m=len(str1)5n=len(str2)6#生成一个存储计算子问题的二位矩阵,并将元素初始化为0。7#这个矩阵的尺寸比两个序列的尺寸分别大1个单位。8#对于这个矩阵,第一行和第一列元素值必然为0。9#C[i][j]的含义是:Xi=(x1,x2,x3,...,xi)和Yj=(y1,y2,x3,...,yj)的最长公共子序列10C=np.zeros((m+1,n+1),dtype=int)11b=np.zeros((m+1,n+1),dtype=int)1213foriinrange(1,m+1):14forjinrange(1,n+1):15#请注意这里为什么是i-1和j-1,因为其实C[1][1]表示的是16#两个序列的首个元素的最长公共子序列,对应的是str1[0]和str2[0]17ifstr1[i-1]==str2[j-1]:18C[i][j]=C[i-1][j-1]+119b[i][j]=1#表示对角线方向20else:21ifC[i][j-1]<=C[i-1][j]:22b[i][j]=2#表示朝上方向23else:24b[i][j]=3#表示朝左方向25C[i][j]=max(C[i][j-1],C[i-1][j])26returnC,b2728test1=['b','d','c','a','b','a']29test2=["a","b","c","b","d","a","b"]30a,b=LCS(test2,test1)3132print(a)#矩阵a存储的是公共子序列的长度,最大值就是最大公共子序列的长度[[0000000][0000111][0111122][0112222][0112233][0122233][0122334][0122344]]

33print(b)#这里:1表示对角线方向、2表示朝上、3表示朝左,主要是为了求具体的子序列用的。[[0000000][0222131][0133213][0221322][0122213][0212222][0222121][0122212]]

THE END
1.算法设计的步骤算法设计的四个步骤算法设计的步骤 第一步:确定程序的入口(即已知条件),出口(条件). 第二步:由第一步画出示意图. 第三步:综合运用正逆思维方式,分析解决问题. 第四步:根据上面的分析,写出顶层较抽象的算法,分析边界情况. 第五步:验证第四步的算法. 第六步:写出具体算法,分析输入.https://blog.csdn.net/xiaojun_2006/article/details/2267375
2.设计一个动态规划算法的过程可分为四个步骤的英文翻译海词词典,最权威的学习词典,专业出版设计一个动态规划算法的过程可分为四个步骤的英文,设计一个动态规划算法的过程可分为四个步骤翻译,设计一个动态规划算法的过程可分为四个步骤英语怎么说等详细讲解。海词词典:学习变容易,记忆很深刻。http://dict.cn/%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%AE%97%E6%B3%95%E7%9A%84%E8%BF%87%E7%A8%8B%E5%8F%AF%E5%88%86%E4%B8%BA%E5%9B%9B%E4%B8%AA%E6%AD%A5%E9%AA%A4
3.二年级数学教案(精选15篇)设计意图:通过观察情境图,提高学生主动获取数学信息的能力。通过引导学生提出问题,提高学生发现问题、提出问题的能力,进而激发学生解决问题的兴趣。 ⊙合作交流,掌握算法 1.教师选取其中与例1类似的问题,让学生在交流的基础上想办法解决。 师:现在请同学们进行小组交流,探讨可以用什么方法解决第四个问题。 https://www.fwsir.com/jiaoan/html/jiaoan_20221205144720_2119659.html
4.多级反馈队列调度算法(重点)七多处理器调度算法设计1.1 cpu调度 其任务是控制、协调进程对cpu的竞争,即按一定的调度算法从就绪队列中选择一个进程,把cpu的使用权交给被选中的进程。如果没有就绪进程,系统会安排一个系统空闲进程或idle进程进入cpu运行。 1.2 系统场景 *N个进程就绪、等待上cpu运行 *M个cpu,M>=1* 需要决策:给哪个进程分配哪一个cpu? https://cloud.tencent.com/developer/article/1124488
5.心法利器[10]算法项目从1到N过程整个流程下来,其实大家就能大概看到一个算法工程师视角的工作是怎么开展的,项目又是怎么管理,这样让我们在任务的执行过程中,逐步摆脱一个“打工人”的身份,而逐步变成一个项目的统筹者、计划者、设计者,我们不应该只是简单的会执行命令,而是会思考。怎么做才对这个项目的短期、长期更有利。https://zhuanlan.zhihu.com/p/437397627
6.软件测试试题库(通用7套)6、典型的瀑布模型的四个阶段是:( ABCD ) A、分析 B、设计 C、编码 D、测试 E、需求调研 F、实施 7. 下面的哪一项测试步骤中需要进行局部数据结构测试: ( A ) A、单元测试 B、集成测试 C、确认测试 D、系统测试 8. 从是否需要执行被测软件的角度,软件测试技术可划分的类型是:(AC )。 https://www.unjs.com/zuixinxiaoxi/ziliao/20170720000008_1398848.html
7.五大常用算法之二:动态规划算法151CTO博客五、算法实现的说明 动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。 最重要的就是确定动态规划三要素: (1)问题的阶段 每个阶段的状态 (3)从前一个阶段转化到后一个阶段之间的递推关系。 递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来https://blog.51cto.com/u_12667998/6544848
8.基于改进A*算法的无人机避障路径规划2 算法设计 A*算法是一种静态路网中求解最短路径最有效的直接搜索算法, 它通过启发函数来引导算法的搜索方向. 针对本文研究的问题, 对A*算法做了一定的改进. 首先输入无人机飞行起始点S, 终止点T. 建立两个数组C1、C2, 用来存放无人机所经过节点的信息. https://c-s-a.org.cn/html/2021/2/7772.html
9.关于计算机二级Access的知识点两步:1概要设计(总体设计):将软件需求转化为数据结构和软件的系统结构;2详细结构(过程设计):通过对结构表示进行细化,得到软件详细的数据结构和算法 七、计算机辅助设计CAD 计算机辅助过程CAE 计算机辅助软件过程CASE 八、 1.软件测试四个步骤:单元测试(静态分析或动态测试)、集成测试、验收测试、系统测试。 https://www.yjbys.com/edu/jisuanjidengji/158075.html
10.数据结构与算法(一):概述算法(Algorithm)一词最早出现在波斯数学家al-Khwarizmi所写的《印度数字算术》中。欧几里得算法(求两个整数的最大公约数)被认为是史上第一个算法。 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 https://developer.aliyun.com/article/1213753
11.数学三年级上册《笔算乘法》说课稿范文(精选3篇)根据教学目标和课后练习,我设计了以下一个作业: 把课后“练习十五”中的1——4题做在课后作业本上。 以下是我本节课的板书设计: (略) 我的说课到此结束,请各位老师和各位同学指导批评。 数学三年级上册《笔算乘法》说课稿2 一、说教材 《三位数乘两位数》是四年级上册第三单元的内容。学生在三年级下册已经学https://xiaoxue.ruiwen.com/shuokegao/128134.html
12.《认识周长》说课稿(精选13篇)特别是后而的拓展延伸环节,这里又跟前面的创设情境部分呼应。这里体现了数学回归到生活的思想,培养学生解决问题的能力。而且这里第一步骤设计得很妙。请你先估一估这幅图的周长。这里体现了估算意识,为了降低难度,用了双面胶作参照物,体现出老师处处从学生角度考虑的思想。https://www.yuwenmi.com/fanwen/shuokegao/1984786.html
13.高中信息技术课程标准四、课程目标 五、内容标准 必修信息技术基础 选修一算法与程序设计 选修二多媒体技术应用 选修三网络技术应用 选修四数据管理技术 选修五人工智能初步 六、实施建议 教学建议 评价建议 教科书编写建议 课程资源的利用与开发建议 七、案例 一、课程性质 信息技术既是一个独立的学科分支,又是所有学科发展的基础。信息https://www.fqkhzx.cn/index/article/view/id/94.html
14.第一章数据结构与算法算法各步骤之间的操作和运算顺序称为算法的控制结构。 三种基本结构:顺序、选择(分支)、循环(重复) 1.3.3 算法的描述工具 N-S结构化流程图、伪代码、流程图、自然语言、程序设计语言 1.4 算法设计的基本方法 递推法、减半递推法、递归法、列举法、回溯法、归纳法 https://www.jianshu.com/p/7507b8dbc8ef