线头 dp
感觉挺神奇的。
不知道该写什么,不如直接看题。
loj #2687. 「BalticOI 2013」Vim
首先可以发现删掉在位置 的 e
有且仅有一种方式,就是走到 并花费 的代价走到 ,再花费 的代价把 e
删掉,最后光标再次回到原来的 。
所以我们可以直接把题意转化成:
给定一个字符串和一个集合,你可以在上面移动(移动规则同原题),求到达集合里面所有位置的方案中的代价最小值。
我们把从 跳到 看成一条线段,这样我们的移动轨迹就是一条折线,端点是停留的位置。
线头 dp 就是处理这种看着不好定转移顺序的折线的东西的,具体来讲,我们从前往后考虑折线,假设考虑到 ,我们把所有跨过 的线段全部记录下来(一般来说我们可以发现一些良好的性质,使得记录的复杂度不是很大),然后考虑怎么更新到 (一般来说是考虑线段是继续延伸还是止步于此)
可以发现一个很神奇的东西,这种情况是不存在的:
![](E:\blog\node_modules\hexo-theme-fluid\source\img\线头 dp1.png)
他是劣于这个的:
![](E:\blog\node_modules\hexo-theme-fluid\source\img\线头 dp2.png)
所以我们发现经过 到 这一段的线段数只可能是 或 ,其中 是操作 f
, 是两个操作 f
和一个操作 h
。(这里考虑 到 这一段是因为我们可以把)
有了这个,我们就可以在 的复杂度内记录下来所有跨过 到 这一段的线段了。
线头 dp
http://lnyxqwq.github.io/2023/09/14/线头 dp/