动态规划的核心思想是巧妙的将问题拆分成多个子问题,通过计算子问题而得到整体问题的解。而子问题又可以拆分成更多的子问题,从而用类似递推迭代的方法解决要求的问题。
动态规划的解题核心主要分为两步:
第一步:状态的定义
有时问题过于抽象或啰嗦,将题干中的问题转化为一系列同类问题的某个解的情况。
比如:求一个数列中最大连续子序列的和。
将问题转化为
即状态定义为:Fk是第k项前的最大序列和,求F1~FN中最大值。
这样的状态定义给出了一种类似通解的思路,把一个原来毫无头绪的问题转换成了可以求解的问题。
第二步:状态转移方程的定义
在进行了状态的定义后,自然而然的想到去求解F1~FN中最大值。这也是状态定义的作用,让我们把一个总体的问题转化成一系列问题,而第二步:状态转移方程的定义则告诉我们如何去求解一个问题,对于上述已经转换成一系列问题我们要关注的点就在于:如何能够用前一项或者前几项的信息得到下一项,这种从最优子状态转换为下一个最优状态的思路就是动态规划的核心。
对于上面的例子题目来说,状态转移方程的定义应该是:
使用场景:
对于一个可拆分问题中存在可以由前若干项计算当前项的问题可以由动态规划计算。