动态规划与优化基础

https://zhuanlan.zhihu.com/p/91582909

这篇文章讲了动态规划的基础,看懂了,现在来总结一下。

首先对于动态规划的定义:

他就是利用计算的历史记录,来避免重复计算。它可以说是一个快速枚举,也可以说是对一些递归的优化。

说明:

状态:就是这个题目中不同规模的问题而已,如数零钱问题就是钱的多少,字符串问题就是字符串的长度

选择:选择就是状态的改变方法,如零钱问题就是一枚硬币的数值,字符串问题就是增加或减少字符串的长度

初始值:初始值就是状态最简单的时候问题的解,这个想出来有手就行。

方法:

①首先要根据题目确定数组元素的含义,这个非常重要。

②确定数组元素含义间的联系,这个有点像数学中的归纳题的关系式的意思,可以根据上述所说的状态和选择进行归纳,这个就是状态转移方程

③确定初始值,这个就是找一些特殊情况,一定要找全来。

  注意:状态转移方程就是根据数组元素推的,如果推不出来可以重新设一下数组元素的含义。比如一个数组长为i,那么dp[i]既可以表示它这个数组的最长子数组和,也可以表示以i为结尾的最长子数组和。这两个的状态方程一个能推,一个不能推。

优化方法:

优化只是对空间进行优化,但是空间优化的程度很大。

状态压缩(降维而已):由于在第二步中,我们是从小到大一步步推导的,所以一般情况下只需要用到上一行数组,因此一定要通过画图来知道需要用哪些变量,并且一定要注意需要使用的变量是否已经被替换。如果被替换需要用别的变量临时存储一下。

另外,大多数情况下,我们是将二维的动态优化数组转化为一维,而这个一维的数组的大小要么为二维数组的一边。在某些情况下,转换问题的行和列对问题解答没有影响,因此可以选择小的那个边。(leetcode 62)

题型:

①极小极大化:用最优策略去完成最坏的情况:375

 ②二维数组问题:即可以从前遍历,也可以从后面开始遍历

posted @ 2021-01-23 09:55  重言  阅读(36)  评论(0)    收藏  举报