动态规划的核心:状态的定义和状态转移方程的定义
至于其他老生常谈的重叠子问题,无后效性,最优子结构都是围绕这两个核心内容来的。
上述的状态转移方程中,等式右边不会用到下标大于左边
或者 的值,这是「无后效性」的通俗上的数学定义,符合这种定义的状态定义,我们可以说它具有「最优子结构」的性质,在动态规划中我们要做的,就是找到这种「最优子结构」。
在对状态和状态转移方程的定义过程中,满足「最优子结构」是一个隐含的条件(否则根本定义不出来)。
需要注意的是,一个问题可能有多种不同的状态定义和状态转移方程定义,存在一个有后效性的定义,不代表该问题不适用动态规划。这也是其他几个答案中出现的逻辑误区:
动态规划方法要寻找符合「最优子结构」的状态和状态转移方程的定义,在找到之后,这个问题就可以以「记忆化地求解递推式」的方法来解决。而寻找到的定义,才是动态规划的本质。
每个阶段只有一个状态 -> 递推;
每个阶段的最优状态都是由上一个阶段的最优状态得到的 -> 贪心;
每个阶段的最优状态是由之前所有阶段的状态的组合得到的 -> 搜索;
每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的 -> 动态规划。
每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到这个性质叫做最优子结构;
而不管之前这个状态是如何得到的,这个性质叫做无后效性。
另: 其实动态规划中的最优状态的说法容易产生误导,以为只需要计算最优状态就好,LIS 问题确实如此,转移时只用到了每个阶段「选」的状态。但实际上有的问题往往需要对每个阶段的所有状态都算出一个最优值,然后根据这些最优值再来找最优状态。比如背包问题就需要对前 个包(阶段)容量为 时(状态)计算出最大价值。然后在最后一个阶段中的所有状态种找到最优值。