多阶段DP问题的定义:一个问题可以分成多个阶段,每个阶段有多个状态,且每个阶段的状态只与上一阶段的状态有关。
这类问题,题目一般会给出多个对象各自的属性和一个限制的条件,然后计算如何操作这些对象获得最优值
我们可以用 dp[阶段][限制条件(状态)] 来记录某个阶段中某个状态的最优解
然后找到dp[i][cur]与上一阶段的状态有什么联系,从有联系的状态中找出最优解
例如01背包问题
对象:物品;
属性:重量、价值
限制条件:背包容量v
dp[i][v] 记录前i个物品(阶段i),剩下容量v时候(限制条件v,或者状态v),能得到的最大价值是多少?
考虑阶段i的最优解,就是在考虑第i个物品是“要”,还是 “不要”
而“要”的话,就与阶段i-1的状态v-w[i]有关
“不要”的话,就与阶段i-1的状态v有关
在上一阶段有联系的状态中找到最优解:
dp[i][v] = max{ dp[i-1][v] , dp[i-1][v-w[i]] + c[i] }