“所有的 $DP$ 问题,本质上都是有限集中的最值问题”——闫学灿
核心思想
从集合的方式来考虑 $DP$ 的状态。
阶段
$DP$ 的阶段:状态和状态转移。
所以有:状态表示和状态计算。
状态表示
把几个具有相同点的元素合在一起考虑,成为一个状态
对于一个状态 $F_i$ ,考虑两个角度:
1.集合: $f(i)$ 表示什么集合
由于 $F_i$ 表示的是一堆东西(这也是 $DP$ 优于枚举的核心),我们要考虑这一堆东西的共同特征,如:所有满足某个条件的元素集合。这一点请仔细考虑,到底是大于等于,大于,小于,小于等于,等于……这些的不同会导致状态计算方式的不同
2.属性: $f(i)$ 的属性
存的数与集合的关系:如 $max,min,count,sum$ 等。
很明显, $F_i$ 大多数时候是一个数,代表这个集合的某一个属性,多是最大值、最小值、数量、总和等。题目问什么,属性一般就是什么。
状态计算
对于 $F_i$ 所表示的集合,我们将其划分为多个子集。
划分的依据——找最后一个不同点(依题而定,即关键决策)
划分之后,根据其子集求 $F_i$ 的值。
举例:当属性为 $max$ 时, $F_i=max($ 子集的 $max)$ ,当属性为 $count$ 时, $F_i=\sum($ 子集的 $count)$ 等。