我意识到了我做 DP 的严重问题。我非常习惯于说去推结论和性质,结果迟迟没有开始试图设计状态。对 DP 理解的非常的不深刻。在推性质的时候应该主动像 DP 上靠。而不是先推再说。要主动地设计状态,尝试几种经典的状态设计。然后试图找出关系。或者是先找出子结构之间的联系。
DP 的本质就是子结构。要主动洞察这个题目有哪些子结构,以及他们之间的良好性质,而不是仅靠“发现”。
我觉得我设计暴力 DP 这件事比 DP 优化更困难。因为我并没有养成这种良好的思维习惯。
开始正题。
这个题目首先就是我们 feel 一下这个题目。
一个 native 的想法是考虑从小到大以 popcnt 为层推进。然后呢你其实可以把他看成一个金字塔。然后你想一下,比如说你当前先把单个元素染个色。然后对于横跨的,怎么办?实际上对于这些横跨的不能随便染色,反例:RBBR 13 24 R 14 23 B 然后就炸了。
然后呢我就摆了,也许是畏惧吧。
你其实可以推进一步,你思考为什么会炸。
因为 R 和 B 的并都是 S。
然后显然 R 和 B 的并不能都不是 S。
然后如果 S 是 R 那一定是 R 的并是 S。反过来同理。
实际上现在你可以直接开始试图设计状态了。
比如你很经典地你设 $f_{S,0/1}$ 为 $S$ 内染色,然后颜色为 $0/1$。然后这个时候你想怎么转移。
你发现你好转移啊,你找这个并不是当前颜色的并。然后你发现其实这个并一定得是对应的 $f$ 然后你直接转移即可。
优化用脚优化。你直接一个一个加即可,套路。