DP优化
前言
个人觉得 dp,贪心,数学之类的东西是困难的,dp 和贪心感觉上有时候是对脑电波。(本来想开坑计算几何的,但是 dp 这个大头还是放不下。)
DP 优化
dp 的组成包括 状态,决策和转移。
可以分别从这三个方面考虑。
状态
优化状态是个技术活,一下子可以想到的方法没有几个,想到了会补充。
换维
影响最深的是中山迪茵集训的 电力工厂
可以设 \(dp(i,h,p,g)\) 表示在第 \(i\) 个回合,有 \(h\) 个人,\(p\) 个电,\(g\) 个石油,的最大产品数。但是这样的状态数和高,发现统计的结果很小,可以考虑换维设 \(dp(i,h,g,e)\) 表示前 \(i\) 个回合结束后人数剩余 \(h\),石油为 \(g\),产品数量为 \(e\),能剩余的最大电力。这样状态数会少很多。
STL 记录状态
还是上面那个题,在原本的 \(dp\) 状态中,发现有许多状态是不会存在的,如果去遍历他们就太浪费了,可以直接用 map 将所有可能用到的状态压进去优化。
决策 和 转移
(我不会告诉你因为我不是很分的清到底是优化决策还是转移所有才把他们放一起的。)
这是比较重要的一点,有许多题都要求对寻找决策这一点进行优化。
矩阵快速幂优化 dp
总的来说,若发现 dp 在转移过程中很大一部分都是一样的,而且需要进行的转移次数即使是 \(O(1)\) 转移也无法满足时间限制时可以考虑将转移写出矩阵,用矩阵快速幂优化。
举个例题 P11362 [NOIP2024] 遗失的赋值。当时在考场上笔者写的正是矩阵快速幂优化 dp。
首先考虑 \(O(n)\) 的 dp,每个点的转移只和当前位置有没有一元限制有关系,那么设 \(dp(i,0/1)\) 表示考虑前 \(i\) 位,当前位是否有一元组限制的方案数。这样对于两种情况推出转移方程,发现一次转移可以 \(O(1)\) 解决,这样有了 \(O(n)\) 的 dp,但是 \(n\leq 10^9\),无法通过。
发现很多转移都是一致的,而且可以写成一个 \(2\times 2\) 的矩阵,那么将极长的相同转移用矩阵快速幂计算即可。
数据结构优化 dp
这是一个很灵活的板块,有时候我们需要在区间内选出最优决策点,这些可以使用数据结构来进行优化。
就先不放题了。口述几个例子:
- 若 dp 的转移是从一段区间内选择最大/最小的点,可以直接线段树优化,最简单的例子是最长上升子序列。
- 若 dp 的转移的情况与一个不等式有关联,可以考虑用 FHQ,以该不等式将 FHQ 划分成两段取决策点。
- 若可以将 dp 转移的式子化成 \(kx+b\) 的形式,而且 \(k,b\) 都是与决策点挂钩的,可以使用李超线段树优化,有个例子是 P2305 [NOI2014] 购票。
- 等等。

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号