适用于
动态规划常常适用于有重叠子问题和最优子结构性质的问题。
最优子结构性质:问题的最优解所包含的子问题的解也是最优的。
子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存,当再次需要计算已经计算过的子问题时,直接调用。
并且在使用 DP 时一定要保证,问题具有无后效性。
即它要求每个子问题的决策不能对后面其他未解决的问题产影响, 如果产生就无法保证决策的最优性, 这就是无后效性。往往需要我们找到一个合适的状态。上述的问题还有另外一个描述方式, 对于后一个节点的判断不能以前面节点的路径为依据。
声明
给出的连接主要是看一下它的代码
自认为很好的题就被标粗,前面加了 √ 辣!并被我放大咯!
树形 DP
树形 DP 和线性的最大区别就是:DP 的顺序是有讲究的,要先 DP 儿子。
如何保证 DP 该点之前子节点已经被 DP 过了呢?
我们可以直接在 DFS 的过程中 DP,DP 时用到了子节点的话就先 DFS 一遍子节点。
【这样特殊在于这种 DFS,不返回一个特定状态值,而是把儿子的所有状态值计算了】
这样就不会出现 DP 顺序的错误辣~(≧▽≦)/~
P.S. 当然也有一类题目的转移是由父亲转移到儿子的,这类题目少见但是经典。
√ 树形 DP 学习笔记
背包 DP
「CodeVS 3269」混合背包 - 背包 DP —— By Menci
背包九讲
区间 DP
书的复制 —— By 小 ly
f[i][j]
表示前
i
个人抄到第