11《算法入门教程》动态规划介

分享
源代码 2024-9-7 11:51:07 105 0 来自 中国
1. 媒介

本节内容是动态规划算法系列之一:动态规划的先容,重要先容了动态规划的定义,什么样的题目适适用动态规划算法去求解,末了阐明动态规划算法在一样平常生存中的应用场景。
2. 什么是动态规划?

动态规划(Dynamic Programming)在数学上属于运筹学的一个分支,是求解决议过程 (decision process)最优化的数学方法,同时也是盘算机科学与技能领域中一种常见的算法头脑。
动态规划算法与我们前面提及的分治算法相似,都是通过组合子题目的解来求解原题目的解。但是两者之间也有很大区别:分治法将题目分别为互不相交的子题目,递归的求解子题目,再将他们的解组合起来求解原题目的解;与之相反,动态规划应用于子题目相互重叠的情况,在这种情况下,分治法照旧会做许多重复的不须要的工作,他会反复求解那些公共的子题目,而动态规划算法则对雷同的每个子题目只会求解一次,将其效果生存起来,制止一些不须要的盘算工作。
Tips: 这里说到的动态规划应用于子题目相互重叠的情况,是指原题目差异的子题目之间具有雷同的更小的子子题目,他们的求解过程和效果完全一样。
动态规划算法更多的时间是用来求解一些最优化题目,这些题目有许多可行解,每个解都有一个值,利用动态规划算法是渴望找到具有最优值的解。接下来,就让我们详细看看动态规划算法的求解思绪及相干应用场景。
3. 动态规划算法求解分析

3.1 实用题目

起首,在利用动态规划算法之前,我们须要清晰哪些题目适适用动态规划算法求解。一样平常而言,能够利用动态规划算法求解的题目都会具备以下两点性子:

  • 最优子布局: 利用动态规划算法求解题目的第一步就是须要描画题目最优解的布局,而且如果一个题目的最优解包罗其子题目的最优解,则此题目具备最优子布局的性子。因此,判定某个题目是否适适用动态规划算法,须要判定该题目是否具有最优子布局。
Tips: 最优子布局的定义重要是在于当前题目的最优解可以从子题目的最优解得出,当子题目满意最优解之后,才可以通过子题目的最优解得到原题目的最优解。

  • 重叠子题目: 适适用动态规划算法去求解的最优化题目应该具备的第二个性子是题目的子题目空间必须富足” 小 “,也就是说原题目递归求解时会重复雷同的子题目,而不是不绝天生新的子题目。如果原题目的递归算法反复求解雷同的子题目,我们就称该最优化题目具有重叠子题目
Tips: 在这里,我们须要留意是,与实用动态规划算法去求解的题目具备重叠子题目性子相反,前面我们先容的分治算法递归解决题目时,题目的子题目都是互不影响,相互独立的,这个也是我们在选用动态规划算法照旧分治法解决题目时的一个判定条件。
3.2 算法步调

在明确什么样的题目适适用动态规划算法去求解时,我们须要把握动态规划算法的求解步调:
步调 1: 描画一个最优解的布局特性
适适用动态规划算法求解的题目须要满意最优子布局的特性,以是在应用动态规划算法时的第一步就是描画题目最优解的布局,一样平常都是用一些数学方法去形貌求解题目,用数学公式表明最优解的布局特性。
步调 2: 递归的定义最优解的值
当应用动态规划算法求解题目时,一样平常我们会递归的求解雷同的子题目,这个时间,我们就须要去递归的定义最优解的值,通常也是先用数学公式去递归定义。
步调 3: 盘算最优解的值
当我们可以清晰的描画一个最优解的布局特性及可以递归的定义出最优解的值之和,一样平常我们就可以接纳自底向上的方法徐徐去盘算每一个最优解的值,大题目的最优解的值依靠于小题目的最优解的值,这个是动态规划算法的核心头脑。
步调 4: 利用盘算出的信息构造一个最优解
前面的步调 1,2,3 是动态规划算法求解题目的底子,如果我们仅仅须要一个最优解的值,而不是须要相识最优解自己,我们可以不消去实验步调 4;如果我们须要相识最优解的详细情况,我们就须要在实验步调 3 的时间维护一些额外的信息,以便用来构造出一个最优解。
4. 动态规划的应用场景

在一样平常的生存学习中,递动态规划算法一样平常可以用来解决许多现实题目。如今,我们就来看看动态规划算法详细有哪些应用场景。
动态规划示例题目:爬楼梯
假设你如今正在爬楼梯,一共须要颠末 n 阶楼梯你才可以到达楼顶。每次你可以爬 楼梯的 1 或 2 个台阶。叨教一共有多少种差异的方法可以爬到楼顶?
如今,让我们按照动态规划算法的求解步调我们来分析一下这个题目:
步调 1: 描画爬楼梯题目一个最优解的布局特性
情况 1:输入 n=1;输出为 1
表明 1:有一种情况可以爬上楼顶, 爬 1 步,记为 1
情况 2:输入 n=2;输出为 2
表明 2:有两种情况可以爬上楼顶,分别为连续两次爬一阶楼梯和一次爬两阶楼梯,记为 1+1,2
情况 3:输入 n=3;输出为 3
表明 3:有三种情况可以爬上楼顶,如情况 1 和 2 形貌一样,记为 1+1+1,2+1,1+2
通太过析可以知道,爬楼梯题目重要在于我们可以一次爬两步或者一步,以是到达末了一阶楼梯 n 时,我们可以从第 n-2 阶楼梯爬两步或者第 n-1 楼梯爬一步完成。
当我们须要知道最多有多少种方法可以爬上 n 阶的楼梯时,我们须要分别知道爬上第 n-2 阶楼梯最多有多少种方法,爬上第 n-1 阶楼梯最多有多少种方法,然后爬上第 n 阶楼梯的最多方法数目即是爬上第 n-1 阶楼梯最多的方法数目加上爬上第 n-2 阶楼梯最多的方法数目
Tips: 在这里,我们可以发现爬楼梯题目满意第 3 节我们定义的动态规划算法须要具备的两种性子,此中的最优子布局就是:爬上 n 阶楼梯的最多方法数包罗爬上第 n-1 楼梯和第 n-2 阶楼梯的最多方法数;重叠子题目:须要反复的盘算爬各阶楼梯的最多方法数。
步调 2: 递归的定义爬 n 阶楼梯最多的方法数

  • 上 1 阶台阶:有 1 钟方法;
  • 上 2 阶台阶:有 1+1 和 2 两种方法;
  • 上 3 阶台阶:到达第 3 阶的方法总数是到达第 1 阶和第 2 阶方法的总和;
  • 上 n 阶台阶:到达第 n 阶的方法总数就是到第 (n-1) 阶和第 (n-2) 阶的方法数之和。
综上所述,我们可以知道爬 n 阶楼梯的状态转移方程可以定义为:goStep (n) = goStep (n-1)+goStep (n-2)。动态规划算法最重要的就是去定义这个状态转移方程,通过这个状态转移方程我们就可以很清晰的去盘算。
步调 3: 盘算爬 n 阶楼梯最多方法数的值
楼梯阶数 n爬 n 阶楼梯最多的方法数11223goStep(1)+goStep(2)=1+2=34goStep(2)+goStep(3)=2+3=55goStep(3)+goStep(4)=3+5=86goStep(4)+goStep(5)=5+8=137goStep(5)+goStep(6)=8+13=218goStep(6)+goStep(7)=13+21=369goStep(7)+goStep(8)=21+36=57步调 4: 利用盘算出的信息构爬 n 阶楼梯每次走几步的方法
着实在爬楼梯这个题目中,我们并不须要统计每次的详细爬楼梯方法,如果须要统计每次详细走法时,须要在盘算的时间记载之前的每一步走法,把信息全部记载生存下来即可。
我们可以很显着的发现,动态规划算法许多时间都是应用于求解一些最优化题目(最大,最小,最多,最少),这类题目在现实生存或者学习科研中常常会遇到,这是一种解决题目的思绪与方法,渴望各人可以好好思考。
5. 小结

本节重要先容了动态规划算法的定义及根本概念,在学完本节课程之后,须要明确什么样的题目适合利用动态规划求解,怎样自己去计划一个动态规划算法,以及我们一样平常生存中哪些应用场景适适用动态规划头脑解决题目。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 14:47, Processed in 0.117146 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表