[ABC320F]FuelRoundT

[ABC320F] Fuel Round Trip

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

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

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

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

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

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

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

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

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

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

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

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

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

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

到目前为止,最终的状态 dpi,h,h,k{0,1,2} 似乎已经能够满足需求了。

转移也是麻烦的。

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

code

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

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17707673.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起