动态规划定义
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。
概念引入(来自百度百科)
在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策问题。在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化的过程为动态规划方法。
经典问题
动态规划的经典问题包括背包问题、打家劫舍、股票问题、子序列问题等。背包问题又包括01背包、完全背包、多重背包等问题,学习时看的文章是这个http://t.csdnimg.cn/ikocn,每个背包问题都解释了而且有代码(*^-^*),特别适合初学者(点头)。关于刷题,我是在力扣上面的算法专题里面有动态规划基础题,如下
不懂的题目在b站看的讲解是一个名字叫 代码随想录 的up主!他有专门的视频是讲解力扣算法的题目,特别好。但是不能产生依赖,还是得先思考实在没思路再看视频嗷。(我刚开始看就是有点偷懒了)
学习总结
关于动态规划的学习,我初步掌握了动态规划解题五部曲:
1.确定dp数组的含义以及下标的含义;
2.确定递推公式;
3.确定dp数组如何初始化;
4.确定遍历顺序;
5.举例推导dp数组。
感觉最难的是部分就是递推公式的推导,但也发现很多问题都能抽象成背包问题,但是也不能直接套01背包的公式,因为有些属于01背包,有些属于完全背包或者多重背包。第二点是遍历顺序的选择,看题目求解的答案是要组合数还是排列数。先遍历背包后遍历物品求的是排列数,先遍历物品后遍历背包求的是组合数。动态规划的求解过程的核心就如它的定义所说的:不断决策求最优解的过程,把一个问题分成一个一个小问题,按照遍历顺序不断做出最优决策,并且当前的状态依赖于之前的状态,即新的决策是由之前的状态更新而来的。