动态规划原理讲解(上)

版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址。 https://blog.csdn.net/xyk_hust/article/details/83933341

大家好,欢迎大家阅读动态规划部分。由于本人水平有限,文中错误之处还请大家批评指正。

动态规划分为两个部分进行讲解,第一部分是原理讲解,第二部分是进行实例分析。

1.1 预备知识:斐波那契数列(Fibonacci Sequence)

例如:arr[1,1,2,3,5,8,13,...]该数列就是斐波那契数列,即第三项是由第二项与第一项的和求得。

公式如下fib(n)=fib(n-1)+fib(n-2)

动态规划问题与该数列的联系就在于,都是求解重叠序列子问题(overlap sub-problem)。

完整的斐波那契数列递推式:

比如我们计算fib(6)的值,下面是利用计算机计算的过程原理:可以将fib(6)分为fib(5)+fib(6),依次进行递归分解。。。

如果进行fib(7)的计算,则需重新计算fib(5),这棵树的规模就会是之前的两倍之多。计算的数字每增加1,算法的复杂度都会达到O(2^{n}),但实际上我们并不需要把整棵树全部展开,比如fib(5)这个节点没必要展开,只需要将之前计算的fib(5)保留一份,下次直接调用即可。

优点:加快运算速度。

计算fib(6),其与fib(5)和fib(4)有关。以此类推。。。

1.2 动态规划问题引入

一个人一共有8个任务可选,图中为灰色长条。任务奖励为红色数字,横轴代表每个任务的时间段(比如值班任务)。比如,第一个任务是从1点到4点,第二个任务是从3点到5点。。。

最终目标:赚最多的奖励。

限制:比如做第5个任务,则另外的任务只能选择8,也就是说任务之间在时间范围上不能有冲突。

采用动态规划的方法来解决这个问题思路: 

方法:选和不选

设定:OPT\left ( i \right )代表最优解,当考虑第i个任务时的最优解。当我考虑第i个任务时,选和不选产生的效果。

考虑第8个任务:选了第8个则不能够选第6个和第7个任务,最好只能选到第5个。不选第8个则考虑前面7个最好的结果。然后在选和不选中选择一个最好的。

重新整理公式:

prev \left(i \right )是选择第i个任务之后,前面可以做的任务。比如,prev \left(8 \right )=5prev \left(7 \right )=3prev \left(6 \right )=2prev \left(2 \right )=0

动态规划展开图:

需要事先将prev算出来。

全局最优解为:

不断进行分解:

  • 只考虑前两个任务,最多只能获得2块钱。

  • 考虑前3个任务:最多能赚8块钱

  • 考虑前4个任务:最多能赚9块钱

  • 最终得到:8个任务中最多可以获得13元。

过程:考虑第8个任务时,选择1,4,8任务。第8 个是从第5个导出,第5个选择1,4。最后选择第1,4,8任务。

最终完成问题求解。

参考视频:https://www.bilibili.com/video/av16544031/?spm_id_from=333.788.videocard.0,非常感谢视频作者的精彩视频。

猜你喜欢

转载自blog.csdn.net/xyk_hust/article/details/83933341
今日推荐