显然的状态定义:用 dp_i 表示前 i 个任务都被完成,所需的时间最小值。(因为 f 用过了,只好用 dp 了qwq)
显然的转移方程:
dp_i = \min\limits_{1 \leqslant j \leqslant i}{dp_{j-1} + \sum\limits_{k = j}^i{tim \times f_k}} = \min\limits_{1 \leqslant j \leqslant i}{dp_{j-1} + tim \times \sum\limits_{k = j}^i{f_k}}
后面的 $ \sum\limits_{k = j}^i{f_k} $ 显然可以用前缀和维护。但是变量 $ tim $ 的出现似乎给算法带来了后效性,因为它与之前分过的组数有关。更确切地说,
$ tim = \sum\limits_{k = 1}^i{t_k} + num \times S
其中 num 是之前已经分过的组数。同样地, \sum\limits_{k = 1}^i{t_k} 可以用前缀和维护。而对于 num ,如果再开一维 dp 数组维护(枚举),开销将会很大。
如何解决?
注意到每在 j 到 i 之间分一组,那么对于之后所有的 k ,其计算时的 num 都会加上 1 。对于 tim 而言就是加上 S 。抛开转移方程讲,就是 这一组 以及后续所有任务的完成时间都要加上 S 。那么对于每个任务 k ,它所需要的费用会加上 S \times f_k ,后面的所有任务总共就会加上 \sum\limits_{k = j}^n{S \times f_k}