[ABC320F]FuelRoundT

[ABC320F] Fuel Round Trip

这道题我们首先观察数据范围,发现 \(n,h\le 300\),于是就可以围绕它想一个三次方的复杂度。

这个数据范围,一般明摆着就是 DP,所以我先往 DP 方向思考。

首先思考如果只要一趟的情况,发现十分简单,令 \(dp_{i,j}\) 表示到达第 \(i\) 个油站,加完/不加后剩余的油量为 \(j\) 的答案。这个很简单,是一个 \(O(nh)\)DP

可是本题有一个往返的限制,但是我们假设回来的时候油站还可以做一次的话,也十分简单,我们只需要做一次简单的对称即可。

对于样例1,我们可以映射成这样:\([0,2,5,9,11,13,17,20,22]\)

其中 \(11\) 是中心,然后可以发现往返的答案,就变成了去一次。

此时,若不考虑对称点只能取一对的情况,方法其实和上面完全一样。

于是我们想:是不是能通过增加一维状态就行了呢?

首先不可能状压,那还有什么方法呢?

经过苦思冥想,我们可以发现,我们可以围绕每一对对称点进行 DP

我们初步的状态就有了 \(dp_i\) 表示考虑过第 \(i\) 对对称点之后的答案(答案就是 \(dp_0\))。

显然,这是不够的,我们需要知道初始进去的油量(我定义不包括进去吃左侧的油),我们就加一维变成 \(dp_{i,h}\)

其次,还是不够的,因为中间的操作会改变流量,我们的代价取决于最终我们希望的流量(我定义包括出去吃右侧的油),所以再加一维表示最终的油量,\(dp_{i,h,h'}\)

到这里可能是够了的,但是我比较弱,觉得需要处理左右只选一种,于是再加一维 \(k\in\{0,1,2\}\)\(0\) 表示两边都不选,\(1\) 表示选择左侧,\(2\) 表示选择右侧)。

到目前为止,最终的状态 \(dp_{i,h,h',k\in\{0,1,2\}}\) 似乎已经能够满足需求了。

转移也是麻烦的。

我们考虑枚举从 \(i\) 进去时的油量 \(w\),若选择了左侧的新油站,那么需要 \(w\leftarrow \min(h,w+f_i)\),然后再判断这么多的油是否能到达 \(i+1\)(即里面的一层),这样我们就能求出里面这一层的到达左边时的油量了。再枚举从 \(i+1\) 出去的油量 \(v\),据此计算出到达右侧的点 \(i\) 时剩余油量,方法与选择了左侧的新油站类似。

code

code 简单优化(维数变换、边界优化)

posted @ 2023-09-17 08:12  wscqwq  阅读(10)  评论(0编辑  收藏  举报