持续更新——dp的一些技巧
共菜鸡笔者看的……会慢慢更新,也请看到的大佬留意一眼,指出不足。
-
对于一些对部分点的二维,状态从左上角继承而来时,对于一个点,对它编号,按照这个顺序,可以保证更新当前值之前前面的已经被更新。
-
善于发掘题目的性质。对于一些一眼看上去没法的东西,观察题目条件,将无用的状态去除或者确定一种顺序之类,变成一个经典的模型。
-
把柿子写完,观察其中有没有类似项的东西,看是不是能够斜率优化。推柿子原则:是所有与有关的项,是项中与有关的部分,是项中与有关的部分,是只与有关的部分。
-
斜率优化的时候,观察题目要求的是,项的的符号,这些是决定凸包方向的重要条件。
-
斜率优化的时候特别留意决策单调性,如果斜率单调,我们可以做到维护决策点;有一些不单调的(比如斜率),就要考虑其他维护决策点的方法。
-
赋值初始值能不用就不用……
-
写前捋清方程,推柿子的时候千万注意符号,如果反了就完了
-
注意树形时,有些走向是从叶子到上面的,这时状态中如果需要有“距离最近的节点”之类,需要记录到这里的祖先,只有祖先可以转移。
-
注意转移的顺序,一定要从之前没有更新的旧状态来更新当前的新状态,否则会错。
-
对于一些做完当前层是需要把一些状态合并掉来方便上面层继续的。
-
在设 最大值的时候一定要注意不要把类型上界卡得特别满,否则很容易溢出错误。
-
计算方案数的时候留意一下不要把计算方案数写成取 或
-
树形背包写刷表会更快。因为枚举上界缩小了。
-
写之前一定要把思路捋清楚 要不然会很惨……
-
检查的时候要贴合 的实际意义,不要写出不符合实际意义的方程式。
-
注意背包一类的 降维后的方程转移有没有后效性影响,一般会再记录一个辅助数组来记录上一次转移的 值是最稳的。
-
写大 像麻将一类的时候一定要心平气和,封装函数,让 部分尽量清新。
-
计算某种情况的贡献的时候,考虑这个局部你计算的答案到底是这个局部的还是对于全局的,不同的计算方式与题意差别很大。
-
区间 有两种不同的转移,一种是枚举断点合并,一种是左右端点慢慢扩展。第二种情况的复杂度是 的。而且往往需要证出来第二种是对的。某些题目数据范围较大而看着像区间 的时候就想想这种转移。
-
对计数类 如果要求求一个串的不同方案能够匹配,不要光考虑已知部分的自相拼接。这样很容易导致算重。也就是说,我们应该尝试去对要构造的目标来 以达到不会算重的目的,写的时候一定要思路清晰,否则有时候自己的方程会算重到了写完代码才反应过来。
-
看到数据范围很小,先考虑状压;某数据范围很大可以考虑矩阵加速。
-
对于一类需要枚举子集中 的位置来转移的 可以用
lowbit
做到一个 的常数优化。因为原本枚举的是所有位置现在变成只枚举 的位置了,常数少了一半。卡常题要用。 -
状压 数据范围大的时候一定要警惕,任何一点点大常数的东西放到转移里面都会让效率大大降低。
-
输出中间变量要在 完了再输出……别还没 就输出了……
-
写 不要忘记转移条件……
-
注意枚举顺序,像背包压维、滚动数组一类的转移顺序都是严格需要注意的。一定不要有后效性!
-
对于斜率优化的柿子 有一种更方便的维护办法 不需要考虑单调性一类的,只需要带上一个 考虑把方程写成 的形式,那么这样我们就把传统斜率优化的柿子中把 看成点变成了把 看为以 为斜率的一条直线,那么对应查询就是直接查询过点 的直线最值。这个东西可以很系统化地用李超树来维护。
-
对于传统斜率优化实际就是把每个点和它的 等看成一个坐标系,而转移的时候斜率固定 ,然后查询所有决策点对应这个斜率的最小/最大截距。
-
计数类 注意是否要乘组合数 如果带着不方便转移就考虑在计算的时候直接把最后计算的除掉 到最后直接乘组合系数
持续
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?