Content:dp优化
Date:2025.7.26

例题

洛谷-P1886 滑动窗口

思路

直接单调队列维护即可,具体操作如下:

  1. 每次查看队尾的元素,维护单调性。
  2. 对于队头不在当前滑动窗口的元素,弹出。

提交记录:link

洛谷-P2365 任务安排

思路

定义 dpidp_{i} 表示第 ii 个任务完成所花费的最小代价。转移如下:

dpi=min1jidpj+(s+TiTj1)×(FnFj1)dp_{i} = \min_{1 \le j \le i} dp_{j} + (s + T_i - T_{j-1}) \times (F_{n} - F{j - 1})

对于本题数据范围 n3000n \le 3000O(n2)O(n^2) 可过。

提交记录:link

洛谷-P10979 任务安排 2

思路

dpdp 的方式和定义与前面相同,但是 O(n2)O(n^2) 的复杂度无法接受,所以考虑优化。

dpdp 的式子拆开,发现:

dpi=min1jidpj+FiTiFjTi+FnsFjsdp_{i} = \min_{1 \le j \le i} dp_{j} + F_{i}T_{i} - F_{j}T_{i} + F_{n}s - F_{j}s

移项,得:

dpj=(Ti+s)Fj+(dpiFiTiFns) dp_{j} = (T_{i} + s)F_{j} + (dp_{i} - F_{i}T_{i} - F_{n}s)

很明显可以用斜率优化,单调队列维护下凸壳即可。

提交记录:link

洛谷-P5785 [SDOI2012] 任务安排

思路

注意数据范围,Ti28\lvert T_i \rvert \le 2^8,所以 Ti+sT_{i}+s 不具有单调性,所以上面面直接维护的方法不可做。于是我们考虑直接维护整个下凸壳,对于转移时,二分查找就可以了。

提交记录:link

洛谷-P4072 [SDOI2016] 征途

思路

我们定义 dpi,jdp_{i,j} 表示到第 ii 天走到了第 jj 个城市的最小平方和。之所以这样定义,是因为:

s2×m2=i(sis)2m×m2=(isim)22×isim×isi+isi2m×m2=(isi)2+m×isi2\begin{aligned} s^2 \times m^2 &= \frac{\sum_{i} (s_i - \overline{s})^2}{m} \times m^2 \\ &= \frac{(\frac{\sum_i s_i}{m})^2 - 2 \times \frac{\sum_i s_i}{m} \times \sum_i si + \sum_i s_i^2}{m} \times m^2 \\ &= -(\sum_i s_i)^2 + m \times \sum_i s_i^2 \end{aligned}

所以最后的答案只和后面的平方和有关。

转移还是单调队列维护下凸壳即可。

提交记录:link