什么是真正的dp?有什么特色?怎么来搞。算法
最近遇到了一些之前的题目发现没有好好的理解就直接写了 大多都是书上的算法并非本身真正的理解。数组
1 关于背包 我总结一下 可能 有助于对模型的更快发现优化
01 背包 通常来讲直接使用一个维度直接继承上一层的状态 对于每个状态咱们能够保证其实最优的因此具备最优子结构因此 是正确的。设计
彻底背包 一个物品无限使用因此咱们只须要能使用就使用便可不须要管数量。blog
多重背包 咱们把状态转移写出来 其实第一次我是这样作的 把多重背包换成01背包的模型而后复杂度 nmci 很是之高,可是换成一个更先进的状态转移。继承
发现每一段都是连续的转移 求某个区间的最大值 直接单调队列就优化了。二进制拆分很久没用了 其实就是分红logn个 而后01背包的选取便可,根据二进制的拆分因此正确性是显然的。队列
这里有一个比较 有创造性的题目。ci
一眼 多重背包单调队列优化 可是其实咱们发现问题的本质是 求某个区间是否有一个1 这样也能够进行前缀和的优化。get
可是皆因常数有点大T掉了。再次考虑优化 咱们发现 只是求 一段区间中离咱们当前值最近的一个1便可。date
虽然可能较远的1也可使用可是 从贪心角度来看 取最近的1给后面带来的决策更优 因而咱们把倒着的过程优化到了正着的过程。
因而 根据贪心的最优性咱们成把两倍常数卡到了一倍常数经过了此题。
分组背包?怎么作?一组中只能选取一个 更实际一点的是 对于一个j来讲 咱们只会选择一个物品 因为是01背包 那么倒着选 而后内层循环 循环物品便可。
多人背包?背包的第k优解 怎么办?设状态 f[i][j] 表示 对于容量为 i 的第j优解 考虑转移 这里考虑刷表法 而后 转移到 某某状态 发现了么 对于同一个i来讲 j增大的时候 f数组单调不增 因此 能够直接归并的完成这个过程。
考虑一些难一些的dp 如 须要优化状态 优化空间 优化转移 ...其中我认为优化状态是最难的 我 基本上就是一个状态想半天 而题解中的状态却设计的 很是的精巧。
接下来讨论一道 对dp的深入理解的题目。
LINK:the heart of the tree 一句话题意 Q次询问每次询问某个点为根的子树内的重心。
关于重心有一些比较好的性质 可是 个人点分树学艺不精 因此 知道的很少。
n 和 Q的数量级都到达了 3e5的数量级 暴力显然不行。咱们至少要再logn的时间内求出答案 我曾想过线段树维护dfs序而后进行区间的操做。发现不太行
考虑 一遍dfs序求出全部点的重心 从子树往上走必然的结果是 此时的重心必定不会往里面跳必定会往上面跳因此 考虑全部的重心向上跳的数量级是O(n)的 直接向上跳便可。
题解中海油 更 有趣的思路是 抱歉没有了我以为并不优秀。核心思想都差很少。
数位dp 这种dp省选之中常常出现 我没有过人的天赋 我也没有出众的才能只能利用本身的 头硬写..
首先是 状态要合适 而后是 状态数量要在可控范围内 转移的时候要注意一些细节 如最高位的限制 及 前导0是否存在。
此时转移 无非就是枚举决策 当前数位填什么qwq... 乌拉前导0 也是能够放到状态之中的和普通的状态不同 值得注意的是
前导0的状况有9*(n-1)种 其中n是数位的个数 其实这个放不放到状态中都是无所谓的了 若是以为很差写那就放到状态中 状态中若是没有亲自开设一个位置给前导0的一系列状态的话也不能强行放到f数组中。
具体的dp细节就是这样了。关键是 状态 状态的数量 及 转移的 细节。
值得一提的是 进行记忆化搜索的retunrn 时注意判断limt的限制是否存在(若是存在天然不能return 我忽略了这一点在不经意间qwq。
update : 数位dp 统计一个区间以内的 符合某种特色的 数字个数 具备多种特色的时候考虑拆分 一个一个求。
这里我以为有两个相似于类似但不相同的 问题。
1:给出一个区间求这个区间中 1-9 分别出现了多少次。
2:给出一个区间求这个区间中每一个数字的数位和?
转换模型 2问题是1问题的子集。$ans2=\sum_{i=1}^{9} ans[i]*i;$
其中 1问题我在求解的时候很是之迷.2问题反而好求一点但复杂度较高
以此我分类讨论 来阐明 数位dp的本质. 数位dp的本质和状态dp的本质同样 状态合并 大大下降复杂度。
考虑第二个问题 如何 解决 考虑 每一个数字 的数位之和 是很小的数字 咱们将这相同的状态进行合并 而后数位dp便可。
每次f数组表示在某某状况下的 目标和是i的方案数便可。
考虑第一个问题 把问题拉向另外一个方向 发现一个数字出现的是1 ~ 9 才对答案有贡献 求某个区间中某个数字出现了多少次 这个显然 也是求某一类有特色的数字 并不是多类 也没有限制当前数字要有多少个
因此 从这一方面考虑状态数量从本来的 位数*9 变到了 9 大大下降了复杂度.
两种方法都经过此题 且 第一种方法比第二种方法不知道快到哪里去了qwq