一种巧妙的DP优化方法——pht转化
P6944 [ICPC2018 WF]Gem Island
之前一直都没有弄懂pht转化有什么用,现在懂了,故作文以记之。
直接从CYJ的题解开始讲起,这种阶梯DP是人都想得出来,只不过是 \(O(n^4)\) 或者 \(O(n^3ln (n))\) 的,本人觉得这道题的关键在于如何优化掉整整一个 \(O(n)\)
首先一个数列的权值就是类似于 \(\sum i*cnt(i)\) 的,先进行一步pht转化得到 \(\sum cnt(x\ge i)\)。
这种转化的意义在于把每一层的区别给打破了,意思就是可以若干层一起转移:
假如没有进行pht转化,那么在做DP的时候我们显然要先枚举那个 \(i\) ,这样就把每一层给彻底区分开来,就无法优化了,但是如果进行pht转化后,每一层的转移的贡献就只与这一层放了多少个元素有关而与这是第几层无关,因此我就可以把枚举层数的那一维给省去了,而在转移的过程中则就是把一堆虽然转移的层数不同但是转移的那层放的元素的个数相等的一坨状态一起转移,而计算的方向也就是 \(d\) 单调递增,我认为这个转化是非常巧妙的。
归纳可以使用pht转化:
① \(ans=\sum i*cnt(i)\)
② 一般都是有多个状态,在转化之后也就是优化掉某个状态之后仍然具有转移的方向