dp的本质
Posted chdy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dp的本质相关的知识,希望对你有一定的参考价值。
什么是真正的dp?有什么特点?怎么来搞。
最近遇到了一些以前的题目发现没有好好的理解就直接写了 大多都是书上的算法并不是自己真正的理解。
1 关于背包 我总结一下 可能 有助于对模型的更快发现
01 背包 一般来说直接使用一个维度直接继承上一层的状态 对于每一个状态我们可以保证其实最优的所以具有最优子结构所以 是正确的。
完全背包 一个物品无限使用所以我们只需要能使用就使用即可不需要管数量。
多重背包 我们把状态转移写出来 其实第一次我是这样做的 把多重背包换成01背包的模型然后复杂度 nmci 非常之高,但是换成一个更先进的状态转移。
发现每一段都是连续的转移 求某个区间的最大值 直接单调队列就优化了。二进制拆分好久没用了 其实就是分成logn个 然后01背包的选取即可,根据二进制的拆分所以正确性是显然的。
这里有一个比较 有创造性的题目。
一眼 多重背包单调队列优化 但是其实我们发现问题的本质是 求某个区间是否有一个1 这样也可以进行前缀和的优化。
但是皆因常数有点大T掉了。再次考虑优化 我们发现 只是求 一段区间中离我们当前值最近的一个1即可。
虽然可能较远的1也可以使用但是 从贪心角度来看 取最近的1给后面带来的决策更优 于是我们把倒着的过程优化到了正着的过程。
于是 根据贪心的最优性我们成把两倍常数卡到了一倍常数通过了此题。
分组背包?怎么做?一组中只能选取一个 更实际一点的是 对于一个j来说 我们只会选择一个物品 由于是01背包 那么倒着选 然后内层循环 循环物品即可。
多人背包?背包的第k优解 怎么办?设状态 f[i][j] 表示 对于容量为 i 的第j优解 考虑转移 这里考虑刷表法 然后 转移到 某某状态 发现了么 对于同一个i来说 j增大的时候 f数组单调不增 所以 可以直接归并的完成这个过程。
以上是关于dp的本质的主要内容,如果未能解决你的问题,请参考以下文章