题意简述
一列灯 $n$ 个,给定初始状态和目标状态。
每次操作可以区间开启/关闭/取反,求最少操作次数从初始状态变为目标状态。
$n\le 10^6$。
主要思路
注意到若相邻两个是先区间反转再区间赋值,可以简单地通过一些变换使得把两者顺序调换。
那么必然存在一个最优操作序列,使得前面全为区间赋值,后面都是区间反转;同时可以有区间赋值操作互不相交。
设 $f(i, [0, 2])$ 为处理到第 $i$ 盏灯,钦定这盏灯被赋值为0/1/2(未被赋值)
,此时需要的区间反转次数的两倍。
简单 dp 即可。
参考代码
1 |
|